Externalizable — 커스텀 직렬화 인터페이스
Externalizable — 커스텀 직렬화 인터페이스
Externalizable 인터페이스는 직렬화 스트림에 Externalizable 인스턴스의 클래스 정체성만 기록되며, 인스턴스의 내용을 저장하고 복원하는 책임은 해당 클래스에 있다는 점이 핵심이에요. writeExternal과 readExternal 메서드를 구현해 클래스가 객체와 그 상위 타입의 스트림 형식과 내용을 완전히 제어할 수 있게 해요.
본문
이 인터페이스는 Serializable을 확장합니다. writeExternal과 readExternal 메서드는 상위 타입과 명시적으로 조율해 상태를 저장해야 하며, 커스터마이즈된 writeObject/readObject 구현을 대체합니다.
객체 직렬화는 Serializable과 Externalizable 인터페이스를 사용하며, 객체 영속성 메커니즘도 이를 사용할 수 있어요. 저장할 각 객체는 Externalizable 인터페이스인지 검사해요. 객체가 Externalizable을 지원하면 writeExternal 메서드가 호출되고, 지원하지 않지만 Serializable을 구현한다면 ObjectOutputStream으로 저장됩니다. Externalizable 객체를 복원할 때는 기본 생성자로 객체를 만든 뒤 readExternal 메서드가 호출돼요. Serializable 객체는 ObjectInputStream에서 읽어 복원해요. Externalizable 인스턴스는 Serializable 인터페이스에 문서화된 writeReplace와 readResolve 메서드로 대체 객체를 지정할 수도 있어요.
메서드
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException— 객체가readExternal메서드를 구현해DataInput의 메서드로 기본형 값을,readObject로 객체·문자열·배열을 호출해 내용을 복원해요.readExternal은writeExternal이 쓴 순서와 타입을 동일하게 읽어야 해요. 복원할 클래스를 찾을 수 없으면ClassNotFoundException을 던질 수 있어요.void writeExternal(ObjectOutput out) throws IOException— 객체가writeExternal메서드를 구현해DataOutput의 메서드로 기본형 값을 저장하거나,ObjectOutput.writeObject를 호출해 객체·문자열·배열을 저장해요.
Externalizable을 사용하면 기본 직렬화가 부족한 경우 완전한 제어로 효율적이고 커스터마이즈된 직렬화를 구현할 수 있어요.