사용자 도구

사이트 도구


java:serialization

Java Serialization 직렬화

Serializable 하지 않은 필드가 중간에 껴 있다면

  • Serializable 한 클래스에 non Serializable 필드가 껴 있다면
  • 이 상황에서 Java 의 직렬화 기능을 사용하면 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 읽기

  • 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 {
    }
java/serialization.txt · 마지막으로 수정됨: 2022/11/29 16:17 저자 kwon37xi