====== Java Serialization 직렬화 ======
* Serializable interface 구현
* 참조 : [[:serialization|Serialization 데이터 직렬화]]
===== Serializable 하지 않은 필드가 중간에 껴 있다면 =====
* ''Serializable'' 한 클래스에 non Serializable 필드가 껴 있다면
* 이 상황에서 Java 의 직렬화 기능을 사용하면 [[https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/Serializable.html|NotSerializableException]] 이 발생하게 된다.
@Test
@DisplayName("serialize : ")
void serialize() throws IOException, ClassNotFoundException {
Person person = new Person("나야나", new Age(41));
System.out.println("직접 생성 객체 : " + person);
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
try ( ObjectOutputStream oos = new ObjectOutputStream(bos)) {
oos.writeObject(person);
}
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()))) {
final Person deserializedPerson = (Person) ois.readObject();
System.out.println("역직렬화 객체 : " + deserializedPerson);
}
}
}
@AllArgsConstructor
@Getter
@Setter
@ToString
public static class Person implements Serializable {
private String name;
private Age age;
}
@AllArgsConstructor
@Getter
@Setter
@ToString
public static class Age {
private int age;
}
결과
serialtest.SerializationTest$Age
java.io.NotSerializableException: serialtest.SerializationTest$Age
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185)
===== serialVersionUID 읽기 =====
* [[http://www.tutorialspoint.com/java/io/objectstreamclass_getserialversionuid.htm|Java.io.ObjectStreamClass.getSerialVersionUID()]]
// create a new object stream class for Integers
ObjectStreamClass osc = ObjectStreamClass.lookup(Integer.class);
// get the serial for Integers
System.out.println("" + osc.getSerialVersionUID());
* serialVersionUID는 Serializable 클래스에서 자동 생성되거나 다음 처럼 명시적 지정가능. 최근에는 자동 생성을 권장하는 추세.
private static final long serialVersionUID = 12345L;
* Eclipse에서 serialVersionUID 없을 때 경고 없애기
@SuppressWarnings("serial")
public class SerializableClass implements Serializable {
}