남궁성 님의 "Java의 정석" 책을 정리한 포스팅 입니다.
7. Serialization
- 객체를 데이터 스트림으로 만드는 것을 뜻합니다.
- 객체를 파일로 저장하거나 네트워크를 통해 서로 주고받을 때 필요합니다.
직렬화에서의 객체
- 직렬화에서의 객체는 "클래스에 정의된 인스턴스 변수의 집합"을 의미합니다.
- 클래스 변수나 클래스 메서드가 포함되지 않습니다.
- 역직렬화 시에 클래스 관련 정보는 불필요합니다.
- 내용물인 변수 값만 가지고 있으면 인스턴스를 메모리에 올릴수 있습니다.
ObjectInputStream & ObjectOutputStream
- 객체를 다루는 보조 스트림 입니다.
- 인스턴스 변수의 직렬화에 사용됩니다.
- 직렬화 시 참조 타입의 객체 변수도 모두 포함됩니다.
FileOutputStream fos = new FileOutputStream("objectfile.ser");
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(new UserInfo());
FileInputStream fis = new FileInputStream("objectfile.ser");
ObjectInputStream in = new ObjectInputStream(fis);
UserInfo info = (UserInfo)in.readObject();
직렬화가 가능한 클래스 만들기
Serializable 인터페이스
- 직렬화 가능한 클래스인지 표시하는 기능입니다.(마커 인터페이스)
- 직렬화하고자 하는 클래스에 Serializable 인터페이스를 구현하여 사용합니다.
transient 키워드
- 직렬화 대상에서 제외되도록 하는데 사용하는 키워드 입니다.
- 특정 필드가 외부에 공개되는데 민감한 정보일 경우, 보안을 위해 쓰입니다.
- 직렬화 기능이 없는 객체일 경우에 사용합니다.
직렬화 가능한 클래스의 버전관리
- 직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스를 사용해야 합니다.
- 즉, 클래스의 버전이 같아야 합니다.
serialVersionUID
- 객체가 직렬화될 때 클래스에 정의된 멤버들의 정보를 이용해서 클래스 버전을 자동 생성합니다.
- 직렬화 내용에 포함됩니다.
- static 변수나 transient 변수는 영향을 미치지 않습니다.
- 역직렬화 할 때 클래스의 버전이 일치하는지 확인한 후 진행합니다.
- 수동으로 관리하려면 추가로 정의합니다.
static final long serialVersionUID = 351234152135L;
InvalidClassException
- 클래스의 이름이 같더라도 구성이 달라진 경우 발생합니다.
- 이러한 경우 역직렬화는 실패합니다.
'Java' 카테고리의 다른 글
[Java의 정석] 13-3. 스레드: 실행 제어 (1) | 2023.11.30 |
---|---|
[Java의 정석] 13-4. 스레드: 동기화 (0) | 2023.11.30 |
[Java의 정석] 15-5. 입출력: File (1) | 2023.11.29 |
[Java의 정석] 15-4. 입출력: 표준 입출력 (0) | 2023.11.29 |
[Java의 정석] 15-3. 입출력: 보조 스트림 (0) | 2023.11.29 |