직렬화(Serialization)

1. 직렬화란 무엇입니까?

객체를 출력하기 위해 필드 값을 바이트 행으로 변경하는 것을 말합니다.

  • 그렇다면 역직렬화란 무엇일까요?
    • 직렬화된 바이트를 개체 필드 값으로 다시 복원합니다.

2. 직렬화 가능 인터페이스

  • 메소드 및 필드 없음
    • 객체가 직렬화될 수 있음을 알려주는 것입니다.
  • Java는 Serializable을 구현하는 클래스로 직렬화를 제한합니다.
  • 클래스의 인스턴스 필드 값은 직렬화 대상입니다.
  • 단, 정적 필드 값과 일시적으로 선언된 필드 값은 직렬화 대상에서 제외된다.

3. 직렬 버전 UID

  • 위에서 언급했듯이 직렬화 및 역직렬화의 기본 요구 사항은 동일한 클래스여야 한다는 것입니다.
  • 그러나 Java는 동일한 클래스인지 어떻게 알 수 있습니까? 클래스 이름 뒤에?
// Client
public class User implement Serializable{

    private String name;
    private int age;
    
    ...
}

// Server
public class User implement Serializable{

    private String name;
    private int age;
    private String address;
    
    ...
}
  • 위의 코드를 보면 클래스 이름은 같지만 필드가 다릅니다.
  • 클라이언트 측에서 직렬화하고 서버 측에서 역직렬화한 데이터를 역직렬화하려고 하면 클래스의 구성이 다르기 때문에 실패할 수밖에 없다.

자바는 클래스의 구성이 달라도 역직렬화가 가능하도록 serialVersionUID라는 상수 값을 제공합니다.

  • Java는 이러한 serialVersionUID 값이 동일할 때 역직렬화할 수 있으며 동일한 클래스로 볼 수 있습니다.
  • 따라서 각 클래스는 고유한 값을 가져야 합니다.

3. IDE를 통해 serialVersionUID 생성

  • intelliJ를 사용하여 설명하겠습니다.
  • Serializable을 처음 구현할 때 serialVersionUID가 자동으로 생성되지 않습니다.
  • 이 경우 다음과 같이 설정할 수 있습니다.
  • Preference Serializable Search Editor – Inspections JVM 언어에서 ‘serialVersionUID’가 없는 직렬화 가능한 클래스를 검사합니다.

  • 아래와 같이 설정했다면

  • User에 상수 필드 “serialVersionUID”라는 항목을 생성하면 처음에 존재하지 않는 항목이 표시됩니다.

  • 아래는 serialVersionUID가 생성된 화면입니다.