====== 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 { }