ObjectInputStream — 직렬화된 객체와 기본형 데이터 역직렬화
ObjectInputStream — 직렬화된 객체와 기본형 데이터 역직렬화
ObjectInputStream은 이전에 ObjectOutputStream으로 쓰여진 기본형 데이터와 객체를 역직렬화해요. 경고: 신뢰할 수 없는 데이터의 역직렬화는 본질적으로 위험하며 피해야 해요. 신뢰할 수 없는 데이터는 Java SE 보안 코딩 지침의 "Serialization and Deserialization" 절에 따라 주의 깊게 검증해야 해요. 역직렬화 공격을 비활성화하는 핵심은 임의 클래스의 인스턴스가 역직렬화되는 것을 막아 그 메서드의 직접·간접 실행을 방지하는 것이에요.
본문
이 클래스는 java.io.InputStream을 상속하며 ObjectInput, ObjectStreamConstants, Closeable, DataInput, AutoCloseable을 구현합니다.
각 스트림은 선택적 역직렬화 필터를 가지며, 역직렬화 중 클래스와 자원 제한을 검사해 스트림에서 읽는 모든 객체를 확인할 수 있어요. 필터는 클래스, 배열 길이, 스트림의 참조 수, 깊이, 입력 스트림에서 소비한 바이트 수가 허용되는지 검사하고, 아니면 역직렬화를 중단할 수 있어요.
ObjectOutputStream과 ObjectInputStream은 FileOutputStream/FileInputStream과 함께 사용하면 객체 그래프의 영속 저장을 제공하고, 소켓 스트림으로 호스트 간 객체 전달, 원격 통신 시스템의 인자 마샬링/언마샬링에도 사용돼요.
ObjectInputStream은 스트림에서 만든 그래프의 모든 객체 타입이 JVM에 있는 클래스와 일치하도록 보장하고, Serializable 또는 Externalizable 인터페이스를 지원하는 객체만 스트림에서 읽을 수 있어요. readObject가 객체를 읽는 데 쓰이며, 기본 데이터 타입은 DataInput의 적절한 메서드로 읽어요. 기본 역직렬화 메커니즘은 각 필드를 쓰였을 당시의 값과 타입으로 복원하고, transient/static 필드는 무시해요. 역직렬화 시 항상 새 객체가 할당되어 기존 객체가 덮어써지지 않아요.
생성자
ObjectInputStream(InputStream in)— 지정한InputStream에서 읽는ObjectInputStream을 만들어요. 스트림 헤더(온전성 검사 포함)를 읽고 검증해요.protected ObjectInputStream() throws IOException, SecurityException—ObjectInputStream의 하위 클래스가 사용하는 생성자예요. 하위 클래스가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 직렬화 프레임워크의 입력측 핵심으로, 객체 상태를 복원해 파일 저장·네트워크 전송 데이터를 되살리는 데 사용돼요.