• 직렬화의 적용은 implements Serializable만 붙이면 될 정도로 간단하지만 진실은 훨씬 더 복잡하다.

 


 

Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다.

  • 클래스가 Serializable을 구현하면 직렬화된 바이트 스트림 인코딩도 하나의 공개 API가 된다.
  • 그래서 이 클래스가 널리 퍼진다면 그 직렬화 형태도 영원히 지원해야 하는 것이다.
  • 커스텀 직렬화 형태를 설계하지 않고 자바의 기본 방식을 사용하면 직렬화 형태는 최소 적용당시 클래스의 내부 구현 방식에 영원히 묶여버린다.
  • 직렬화 가능 클래스를 만들고자 한다면, 길게 보고 감당할 수 있을 만큼 고품질의 직렬화 형태도 주의해서 함께 설계해야 한다.

 

 

버그와 보안 구멍이 생길 위험이 높아진다.

  • 직렬화는 언어의 기본 메커니즘을 우회하는 객체 생성 방식이다.
    • 객체는 생성자를 사용해 만드는게 기본이다.
  • 기본 방식을 따르든 재정의해 사용하든 역직렬화는 일반 생성자의 문제가 그대로 적용되는 숨은 생성자이다.
  • 기본 역직렬화를 사용하면 불변식 깨짐과 허가되지 않은 접근에 쉽게 노출된다.

 

 

해당 클래스의 신버전을 릴리스할 때 테스트할 것이 늘어난다.

  • 직렬화 가능 클래스가 수정되면 직렬화/역직렬화가 문제 없이 진행되는지 검사해야한다.

 

 

상속용으로 설계된 클래스는 대부분 Serializable을 구현하면 안 되며, 인터페이스 대부분 Serializable을 확장해서는 안된다.

  • 클래스 확장시에 부담이 커진다.

 

 

내부 클래스는 직렬화를 구현하지 말아야 한다.

  • 내부 클래스에는 바깥 인스턴스의 참조와 유효 범위 안의 지역변수 값들을 저장하기 위해 컴파일러가 생성한 필드들이 자동으로 추가된다.

+ Recent posts