1. 직렬화란
객체를 출력하기 위해서 필드 값들을 일렬로 늘어선 바이트로 변경하는 것을 말한다.
- 그렇다면 역직렬화(Deserialization)이란
- 직렬화된 바이트를 객체의 필드 값들로 다시 복구 시키는 것을 말한다.
2. Serializable 인터페이스
- 아무런 메서드와 필드가 없다
- ➡️ 객체를 직렬화할 수 있다고 알려주는 역할만 한다.
- 자바는 Serializable을 구현한 클래스만 직렬화 할 수 있도록 제한하고 있다.
- 클래스의 인스턴스 필드 값들은 직렬화의 대상이다.
- 하지만, static 필드 값과 transient로 선언된 필드값은 직렬화에서 제외된다.
3. serialVersionUID
- 위에서 말했듯이 직렬화, 역직렬화를 하는데 있어서 기본 전제조건은 동일한 클래스여야 한다는 것이다.
- 하지만 동일한 클래스인지 자바가 어떻게 알아낼까? 클래스의 이름으로?
// 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라는 상수값을 제공한다.
- 자바는 이 serialVersionUID값이 같으면 같은 클래스로 보고 역직렬화를 할 수 있다.
- 따라서 클래스마다 유일한 값을 갖도록 해야 한다.
3. IDE를 통한 serialVersionUID 생성하기
- intelliJ를 기준으로 설명하겠다.
- 처음에 Serializable을 구현하면 serialVersionUID가 자동적으로 생기지 않는다.
- 그럴 땐 아래와 같이 세팅을 해주면 된다.
- preference ➡️ serializable 검색 ➡️ Editor - Inspections ➡️ JVM languages에서 Serializable class without 'serialVersionUID' 항목을 체크해준다.

- 아래와 같이 설정을 해주면

- 처음에는 없었던 Create constant field 'serialVersionUID' in 'User'라는 항목이 나온다.

- 아래는 serialVersionUID가 생성된 화면이다.
'Java' 카테고리의 다른 글
[Java] TCP 네트워킹 (0) | 2023.03.29 |
---|---|
[Java] File과 Files (0) | 2023.03.29 |
[Java] 데이터 입출력(2) (0) | 2023.02.27 |
[Java] 데이터 입출력(1) (0) | 2023.02.21 |
[Java] 스트림(Stream)(2) (0) | 2023.02.13 |