Serialize(직렬화)란?
말그대로 객체를 직렬화하여 전송 가능한 형태로 만드는 것을 의미한다.
객체의 상태를 바이트 스트림으로 변환하는데 사용되는 프로세스로, 디스크 / 파일로 유지되거나 네트워크 통신을 통해 실행중인 다른 Java 가상머신으로 전송될 수 있다.
이것은 주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 주로 사용된다.
직렬화는 생성한 클래스를 Serializable 인터페이스를 구현하는 클래스로 만듬으로써 가능하다.
역직렬화(Deserialize)
바이트 스트림을 다시 객체형태로 변환하는 작업을 말한다. 생성된 바이트는 플랫폼에 독립적이며 한 플랫폼에서 직렬화된 객체는 다른 플랫폼에서 역직렬화를 통해 데이터를 받아올 수 있다.
serialVersionUID
객체의 해시코드로 직렬화될 때 객체에 표시되는 식별자 역할을 한다.
serialver와 같은 툴로 객체의 serialVersionUID를 알아낼 수 있으며 객체의 버전관리에 사용된다.
serialVersionUID를 지정하지 않으면 클래스에서 필드를 추가하거나 수정할 때 serialVersionUID가 새 클래스에 대해 생성되고 이전 직렬화된 객체가 다르기 때문에 이미 직렬화된 객체를 복구할 수 없다.
Java 직렬화 프로세스는 직렬화된 객체의 상태를 복구하기 위해 올바른 serialVersionUID를 사용하고 serialVersionUID가 일치하지 않는 경우 java.io.InvalidClassException을 발생시킨다.
직렬화 대상
Class SerialEx implements Serializable{
private String email;
private int age;
public SerialEx(String name, String email, int age) {
this.name = name;
this.email = email;
this.age = age;
}
@Override
public String toString() {
return String.format("SerialEx{name='%s', email='%s', age='%s'}", name, email, age);
}
}
직렬화 예제
class Scratch {
public static void main(String[] args) {
String byteString = serialize();
System.out.println(byteString);
}
private static String serialize() {
SerialEx example = new SerialEx("serial", "serial@tistory.co.kr", 31);
byte[] serialized;
String serializedStr = "";
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(example);
serialized = baos.toByteArray();
serializedStr = Base64.getEncoder().encodeToString(serialized);
}
} catch (Exception e) {
e.printStackTrace();
}
return serializedStr;
}
}
역직렬화(Deserialization) 예제
class Scratch {
public static void main(String[] args) {
String serializedStr = "";
byte[] serialized = Base64.getDecoder().decode(serializedStr);
deserialize(serialized);
}
private static void deserialize(byte[] serialized) {
try (ByteArrayInputStream bais = new ByteArrayInputStream(serialized)) {
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
Object o = ois.readObject();
SerialEx o1 = (SerialEx) o;
System.out.println(o1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
참고
'언어 > JAVA' 카테고리의 다른 글
람다식(Lambda Expression) (0) | 2021.12.17 |
---|---|
Stream (0) | 2021.12.16 |
Java 입출력 (InputStream/OutputStream) (0) | 2021.12.11 |
Hash (0) | 2021.12.07 |
22장 자바 컬렉션 part1 (0) | 2021.11.05 |