ObjectInputStream — 직렬화된 객체와 기본형 데이터 역직렬화

ObjectInputStream — 직렬화된 객체와 기본형 데이터 역직렬화

ObjectInputStream은 이전에 ObjectOutputStream으로 쓰여진 기본형 데이터와 객체를 역직렬화해요. 경고: 신뢰할 수 없는 데이터의 역직렬화는 본질적으로 위험하며 피해야 해요. 신뢰할 수 없는 데이터는 Java SE 보안 코딩 지침의 "Serialization and Deserialization" 절에 따라 주의 깊게 검증해야 해요. 역직렬화 공격을 비활성화하는 핵심은 임의 클래스의 인스턴스가 역직렬화되는 것을 막아 그 메서드의 직접·간접 실행을 방지하는 것이에요.

출처: Java API Reference

본문

이 클래스는 java.io.InputStream을 상속하며 ObjectInput, ObjectStreamConstants, Closeable, DataInput, AutoCloseable을 구현합니다.

각 스트림은 선택적 역직렬화 필터를 가지며, 역직렬화 중 클래스와 자원 제한을 검사해 스트림에서 읽는 모든 객체를 확인할 수 있어요. 필터는 클래스, 배열 길이, 스트림의 참조 수, 깊이, 입력 스트림에서 소비한 바이트 수가 허용되는지 검사하고, 아니면 역직렬화를 중단할 수 있어요.

ObjectOutputStreamObjectInputStreamFileOutputStream/FileInputStream과 함께 사용하면 객체 그래프의 영속 저장을 제공하고, 소켓 스트림으로 호스트 간 객체 전달, 원격 통신 시스템의 인자 마샬링/언마샬링에도 사용돼요.

ObjectInputStream은 스트림에서 만든 그래프의 모든 객체 타입이 JVM에 있는 클래스와 일치하도록 보장하고, Serializable 또는 Externalizable 인터페이스를 지원하는 객체만 스트림에서 읽을 수 있어요. readObject가 객체를 읽는 데 쓰이며, 기본 데이터 타입은 DataInput의 적절한 메서드로 읽어요. 기본 역직렬화 메커니즘은 각 필드를 쓰였을 당시의 값과 타입으로 복원하고, transient/static 필드는 무시해요. 역직렬화 시 항상 새 객체가 할당되어 기존 객체가 덮어써지지 않아요.

생성자

  • ObjectInputStream(InputStream in) — 지정한 InputStream에서 읽는 ObjectInputStream을 만들어요. 스트림 헤더(온전성 검사 포함)를 읽고 검증해요.
  • protected ObjectInputStream() throws IOException, SecurityExceptionObjectInputStream의 하위 클래스가 사용하는 생성자예요. 하위 클래스가 readStreamHeader를 호출해야 해요.

메서드 (주요)

  • final Object readObject()ObjectOutputStream에서 쓰여진 객체를 읽어요. readUnshared와 달리 같은 객체에 대한 참조는 동등하게 처리해요.
  • final Object readUnshared()writeUnshared로 쓰여진 객체를 읽어요. 객체 그래프를 재구성하지 않고 제공된 객체를 반환해요.
  • final void defaultReadObject() — 현재 클래스의 비static·비transient 필드를 스트림에서 읽어요.
  • GetField readFields()ObjectInputStream.GetField를 만들어 현재 클래스의 필드를 읽을 수 있게 해요.
  • void registerValidation(ObjectInputValidation obj, int prio) — 그래프가 완전히 역직렬화된 후 호출될 검증 콜백을 등록해요.
  • final int readInt(), readUTF(), readBoolean(), readChar(), readByte(), readShort(), readLong(), readFloat(), readDouble() 등 — DataInput의 기본형 읽기 메서드예요.
  • void reset() — 역직렬화 캐시를 재설정해요.
  • void close() — 입력 스트림을 닫아요.
  • void setObjectInputFilter(ObjectInputFilter filter) — 이 스트림의 역직렬화 필터를 설정해요.

ObjectInputStream은 Java 직렬화 프레임워크의 입력측 핵심으로, 객체 상태를 복원해 파일 저장·네트워크 전송 데이터를 되살리는 데 사용돼요.

더 알아보기 (Learn more)