ObjectOutputStream — 기본형 데이터와 객체 그래프 쓰기
ObjectOutputStream — 기본형 데이터와 객체 그래프 쓰기
ObjectOutputStream은 기본 데이터 타입과 Java 객체의 그래프를 OutputStream에 써요. 객체는 ObjectInputStream으로 읽어(재구성) 복원할 수 있어요. 객체의 영속적 저장은 스트림에 파일을 사용해 달성할 수 있고, 스트림이 네트워크 소켓 스트림이면 객체를 다른 호스트나 다른 프로세스에서 재구성할 수 있어요. java.io.Serializable 인터페이스를 지원하는 객체만 스트림에 쓸 수 있어요.
본문
이 클래스는 java.io.OutputStream을 상속하며 ObjectOutput, ObjectStreamConstants, Closeable, DataOutput, Flushable, AutoCloseable을 구현합니다.
각 직렬화 가능 객체의 클래스는 클래스 이름과 시그니처, 객체의 필드와 배열 값, 최초 객체에서 참조된 다른 객체의 폐포(closure)를 포함해 인코딩됩니다. writeObject 메서드로 객체를 스트림에 씁니다. 객체(문자열과 배열 포함)는 모두 writeObject로 씁니다. 여러 객체나 기본형을 스트림에 쓸 수 있으며, 대응하는 ObjectInputStream으로 같은 타입과 같은 순서로 다시 읽어야 해요. 기본 데이터 타입은 DataOutput의 적절한 메서드로 쓸 수도 있고, 문자열은 writeUTF로 쓸 수 있어요.
단일 객체에 대한 여러 참조는 참조 공유 메커니즘으로 인코딩되어 객체 그래프가 원래 쓰였을 때와 같은 모양으로 복원될 수 있어요.
직렬화·역직렬화 중 특별한 처리가 필요한 Serializable 클래스는 writeObject/readObject 메서드를 구현해야 해요. writeObject는 그 클래스의 상태를 써서 대응하는 readObject가 복원할 수 있게 해요. Externalizable 인터페이스를 구현하면 객체가 완전한 제어를 가정할 수 있고, writeExternal/readExternal 메서드로 상태를 저장·복원해요.
생성자
ObjectOutputStream(OutputStream out)— 지정한OutputStream에 쓰는ObjectOutputStream을 만들어요. 기반 스트림 헤더가 쓰여질 수 없으면IOException을 던져요.protected ObjectOutputStream() throws IOException, SecurityException—ObjectOutputStream의 하위 클래스가 사용하는 생성자예요.
메서드 (주요)
void writeObject(Object obj)— 지정한 객체를ObjectOutputStream에 써요. 객체의 클래스, 클래스의 시그니처, 클래스의 비transient·비static 필드 값, 배열의 값, 그리고 이 외에 참조된 다른 객체를 써요.NotSerializableException이 발생하면 직렬화가 중단돼요.void writeUnshared(Object obj)— 이전에 쓰인 객체와 다른writeObject와 같은 방식으로 객체를 써요.void flush()— 스트림을 플러시해요.void close()— 스트림을 닫아요.void defaultWriteObject()— 현재 클래스의 기본 필드를 써요.PutField putFields()—ObjectOutputStream.PutField를 만들어 현재 클래스의 필드를 쓸 수 있게 해요.void reset()— 스트림의 버퍼를 재설정해 참조 공유 정보를 버려요.int size()—ObjectOutputStream의 버퍼에 쓴 바이트 수를 계산해 반환해요.
ObjectOutputStream은 Java 객체 직렬화의 핵심으로, 객체 상태를 바이트로 저장해 파일 저장, 네트워크 전송, 캐싱 등에 활용할 수 있어요.