Java

[Java의 정석] 15-6. 입출력: Serialization

noahkim_ 2023. 11. 29. 20:06

남궁성 님의 "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
  • 클래스의 이름이 같더라도 구성이 달라진 경우 발생합니다.
  • 이러한 경우 역직렬화는 실패합니다.