Serialize(직렬화)?
자바 시스템 내부에서 사용되는 Object나 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술로 JVM(Java Virtual Machine)의 메모리에 항상 있는 객체 데이터를 byte 형태로 변환한다.
Java에서는 java.io.Serializeable
인터페이스를 상속하여 사용합니다.
Serializable을 상속한 Hello class
public class Hello implements Serializable {
private String sound = "";
public SingSong(String sound) {
this.sound = sound;
}
}
main()
public static void main(String[] args) {
Hello hello = new Hello("LoveOfMyLife");
byte[] serializedMember;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(hello);
// serializedMember -> 직렬화된 hello class
serializedMember = baos.toByteArray();
}
}
// 바이트 배열로 생성된 직렬화 데이터를 base64로 변환
System.out.println(Base64.getEncoder().encodeToString(serializedMember));
}
Deserialize(역직렬화)
byte로 변환된 Object나 Data를 다시 Object나 Data로 변환하는 기술로 직렬화된 byte를 Object나 Data를 다시 JVM에 상주시킨다.
java.io.ObjectInputStream
을 사용하여 역직렬화를 합니다.
main()
public static void main(String[] args){
// 직렬화 예제에서 생성된 base64 데이터
String base64Member = "...생략";
byte[] serializedMember = Base64.getDecoder().decode(base64Member);
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)) {
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
// 역직렬화된 Hello 객체를 읽어온다.
Object objectMember = ois.readObject();
Hello hello = (Hello) objectMember;
System.out.println(hello);
}
}
}
serialVersionUID 사용이유
Java의 Serialize는 치명적인 문제를 가지고 있습니다.
Serialize한 Object나 Data를 Deserialize할 때, Serialize와 Deserialize하는 시스템이 다른 경우(ex. 버전문제) 에러(InvalidClassException)가 생성되게 됩니다.
따라서 시스템의 버전의 호환성을 유지하기 위해서는 serialVersionUID가 필요합니다.
'Language > Java' 카테고리의 다른 글
Java 형변환(Casting)이란 (0) | 2019.03.19 |
---|---|
Java 변수 기본형과 참조형 (0) | 2019.03.17 |
Java String... 은 무엇인가? (1) | 2019.03.08 |
Java UUID 사용하기 (1) | 2019.03.07 |
Java 오버로딩, 오버라이딩 (0) | 2019.03.01 |