Skip to content

Latest commit

ย 

History

History
62 lines (49 loc) ยท 2.99 KB

File metadata and controls

62 lines (49 loc) ยท 2.99 KB

Serialization & Deserialization

์ง๋ ฌํ™” Serialization

์ง๋ ฌํ™”๋ž€ ์ž๋ฐ” ์‹œ์Šคํ…œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์˜ ์ž๋ฐ” ์‹œ์Šคํ…œ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก byte ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
๊ฐ PC๋Š” OS๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— Reference Type์˜ ๋ฐ์ดํ„ฐ๋“ค์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์†Œ๊ฐ’์ด ์•„๋‹Œ Byte ํ˜•ํƒœ๋กœ ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋“ค์€ ๋ชจ๋‘ Primitive Type์ด ๋˜๊ณ , ์ด๋Š” ํŒŒ์ผ ์ €์žฅ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์ „์†ก ์‹œ ํŒŒ์‹ฑ์ด ๊ฐ€๋Šฅํ•œ ์œ ์˜๋ฏธํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ „์†ก ๋ฐ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ง๋ ฌํ™”์ž…๋‹ˆ๋‹ค.

java.io.Serializable ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์œผ๋กœ ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ex. JVM์— ์ƒ์ฃผํ•˜๋Š” ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†ํ™”ํ•  ๋•Œ, Servlet Session, Cache, Java RMI(Remote Method Ivocation)

@Entity
@AllArgsConstructor
@toString
public class Post implements Serializable {
private static final long serialVersionUID = 1L;

private String title;
private String content;

Post post = new Post("์ œ๋ชฉ", "๋‚ด์šฉ");
byte[] serializedPost;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
    try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
        oos.writeObject(post);

        serializedPost = baos.toByteArray();
    }
}

ObjectOutputStream์„ ํ†ตํ•ด ์ง๋ ฌํ™”ํ•˜์—ฌ Byte๋กœ ๋ณ€ํ™˜๋œ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก serialVersionUID๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ์ด์œ 
serialVersionUID๋Š” ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ํ•ด์‹œ๊ฐ’์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
์ง์ ‘ ์„ค์ •ํ•œ ์ด์œ ๋Š” ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด serialVersionUID ๊ฐ’ ๋˜ํ•œ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ญ์ง๋ ฌํ™” ์‹œ Exception์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ง๋ ฌํ™”์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์—ญ์ง๋ ฌํ™” Deserialization

์—ญ์ง๋ ฌํ™”๋ž€ ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ์ชฝ์—์„œ ๋‹ค์‹œ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ง๋ ฌํ™”๋œ ๋ฐ”์ดํŠธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ JVM์œผ๋กœ ์ƒ์ฃผ์‹œํ‚ค๋Š” ํ˜•ํƒœ์˜ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
์ง๋ ฌํ™” ๋Œ€์ƒ์ด ๋œ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ class path์— ์กด์žฌํ•ด์•ผ ํ•˜๊ณ  import ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ž๋ฐ” ์ง๋ ฌํ™” ๋Œ€์ƒ ๊ฐ์ฒด์™€ ๋™์ผํ•œ serialVersionUID๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedPost)) {
    try (ObjectInputStream ois = new ObjectInputStream(bais)) {

        Object objectPost = ois.readObject();
        Post post = (Post) objectPost;
    }
}

ObjectOutputStream์œผ๋กœ Byte์˜ ๊ฐ’์„ ๋‹ค์‹œ ๊ฐ์ฒด์— ์ €์žฅํ•˜์—ฌ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.