Externalizable — 커스텀 직렬화 인터페이스

Externalizable — 커스텀 직렬화 인터페이스

Externalizable 인터페이스는 직렬화 스트림에 Externalizable 인스턴스의 클래스 정체성만 기록되며, 인스턴스의 내용을 저장하고 복원하는 책임은 해당 클래스에 있다는 점이 핵심이에요. writeExternalreadExternal 메서드를 구현해 클래스가 객체와 그 상위 타입의 스트림 형식과 내용을 완전히 제어할 수 있게 해요.

출처: Java API Reference

본문

이 인터페이스는 Serializable을 확장합니다. writeExternalreadExternal 메서드는 상위 타입과 명시적으로 조율해 상태를 저장해야 하며, 커스터마이즈된 writeObject/readObject 구현을 대체합니다.

객체 직렬화는 SerializableExternalizable 인터페이스를 사용하며, 객체 영속성 메커니즘도 이를 사용할 수 있어요. 저장할 각 객체는 Externalizable 인터페이스인지 검사해요. 객체가 Externalizable을 지원하면 writeExternal 메서드가 호출되고, 지원하지 않지만 Serializable을 구현한다면 ObjectOutputStream으로 저장됩니다. Externalizable 객체를 복원할 때는 기본 생성자로 객체를 만든 뒤 readExternal 메서드가 호출돼요. Serializable 객체는 ObjectInputStream에서 읽어 복원해요. Externalizable 인스턴스는 Serializable 인터페이스에 문서화된 writeReplacereadResolve 메서드로 대체 객체를 지정할 수도 있어요.

메서드

  • void readExternal(ObjectInput in) throws IOException, ClassNotFoundException — 객체가 readExternal 메서드를 구현해 DataInput의 메서드로 기본형 값을, readObject로 객체·문자열·배열을 호출해 내용을 복원해요. readExternalwriteExternal이 쓴 순서와 타입을 동일하게 읽어야 해요. 복원할 클래스를 찾을 수 없으면 ClassNotFoundException을 던질 수 있어요.
  • void writeExternal(ObjectOutput out) throws IOException — 객체가 writeExternal 메서드를 구현해 DataOutput의 메서드로 기본형 값을 저장하거나, ObjectOutput.writeObject를 호출해 객체·문자열·배열을 저장해요.

Externalizable을 사용하면 기본 직렬화가 부족한 경우 완전한 제어로 효율적이고 커스터마이즈된 직렬화를 구현할 수 있어요.

더 알아보기 (Learn more)