JAVA/포스팅

자바 ObjectInputStream

짜집퍼박사(짜박) 2023. 11. 26. 22:28

ObjectInputStream은 자바에서 객체를 역직렬화하는 데 사용되는 클래스입니다. 이 클래스는 InputStream을 확장하며, 직렬화된 객체를 역직렬화하여 원래의 객체로 복원할 수 있게 해줍니다.

 

ObjectInputStream의 주요 메서드

 

1. Object readObject() 메서드

- 직렬화된 객체를 역직렬화하여 반환합니다.
- 반환된 객체의 실제 타입은 Object이므로, 필요에 따라 형변환을 수행해야 합니다.
- 만약 역직렬화 중에 클래스가 찾아지지 않거나 클래스의 버전이 일치하지 않는 경우 ClassNotFoundException이 발생할 수 있습니다.

try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.ser"))) {
    MyClass restoredObject = (MyClass) ois.readObject();
    // 역직렬화된 객체를 사용하는 코드
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

 

2. void defaultReadObject() 메서드

- readObject() 메서드 내에서 호출되며, 객체의 기본 필드들을 역직렬화합니다.
- 직렬화된 객체의 필드 중 transient로 선언되지 않은 필드들은 역직렬화 시에 자동으로 복원됩니다.

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject(); // 기본 필드들을 역직렬화
    // 추가적인 역직렬화 로직
}

 

3. ObjectInputStream.GetField readFields() 메서드

- readObject() 메서드 내에서 호출되며, serialPersistentFields에 명시된 필드들을 역직렬화합니다.
- readObject() 내에서 사용자가 직접 필드를 역직렬화할 때 이용됩니다.

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    ObjectInputStream.GetField fields = in.readFields(); // 명시된 필드들을 역직렬화
    int intValue = fields.get("intValue", 0);
    // 추가적인 역직렬화 로직
}

 

4. int read() 및 int read(byte[] b, int off, int len) 메서드

상속받은 InputStream의 메서드로, 바이트 스트림에서 데이터를 읽습니다.

byte[] buffer = new byte[1024];
int bytesRead = ois.read(buffer, 0, buffer.length);

 

 

ObjectInputStream 사용 시 주의사항

1. 보안: ObjectInputStream을 사용할 때, 직렬화된 데이터의 출처가 신뢰할만한지 확인해야 합니다. 악의적인 객체를 역직렬화하는 공격을 방지하기 위해, 클래스 패스와 객체의 버전 등을 신중하게 관리해야 합니다.
2. 버전 관리: 직렬화된 객체의 클래스에 변경이 생기면 버전 UID를 명시적으로 설정하여 버전 관리를 해주어야 합니다. 그렇지 않으면 클래스 변경에 따른 역직렬화 오류가 발생할 수 있습니다.
3. readObject() 메서드 사용자 정의: 클래스에 사용자 정의된 readObject() 메서드가 있는 경우, 이 메서드 내에서 defaultReadObject() 등을 올바르게 호출해주어야 합니다.

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject(); // 기본 필드들을 역직렬화
    // 추가적인 역직렬화 로직
}

4. 성능: 큰 객체나 여러 객체를 연속으로 역직렬화할 때는 성능에 주의해야 합니다. 큰 객체를 역직렬화하면 메모리 사용량이 늘어날 수 있고, 여러 객체를 한 번에 역직렬화할 경우에는 객체 간의 의존성에 주의해야 합니다.

 

이러한 주의사항을 지키면서 ObjectInputStream을 사용하면 객체를 직렬화하고 역직렬화할 수 있습니다.

 

With ChatGPT

'JAVA > 포스팅' 카테고리의 다른 글

자바 직렬화 Serializable  (0) 2023.11.26
자바 ObjectOutputStream  (0) 2023.11.26
자바 직렬화(Serialization)  (0) 2023.11.26
자바 File  (0) 2023.11.26
자바 RandomAccessFile  (0) 2023.11.26