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가 생성된 화면입니다.

