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 |