JAVA/포스팅

자바 ObjectOutputStream

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

ObjectOutputStream 클래스는 자바에서 객체를 직렬화하여 바이트 스트림으로 출력하는 데 사용되는 클래스입니다. 직렬화는 객체를 저장하거나 네트워크를 통해 전송하기 위해 객체를 바이트 스트림으로 변환하는 프로세스를 말합니다.

 

ObjectOutputStream의 생성자

public ObjectOutputStream(OutputStream out) throws IOException

OutputStream을 매개변수로 받아 ObjectOutputStream 객체를 생성합니다.
주어진 출력 스트림을 사용하여 객체를 직렬화한 후 전송하거나 저장할 수 있습니다.

 

주요 메서드

 

1. void writeObject(Object obj) 메서드

- 주어진 객체를 직렬화하여 출력 스트림에 기록합니다.
- 객체는 Serializable 인터페이스를 구현해야 합니다.

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.ser"))) {
    MyClass obj = new MyClass();
    oos.writeObject(obj);
} catch (IOException e) {
    e.printStackTrace();
}

 

2. void defaultWriteObject() 메서드

- writeObject() 메서드 내에서 호출되며, 객체의 기본 필드들을 직렬화합니다.
- 직렬화되지 않아야 하는 필드는 transient로 선언되어야 합니다.

private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject(); // 기본 필드들을 직렬화
    // 추가적인 직렬화 로직
}

 

3. PutField putFields() 메서드와 void writeFields() 메서드

- writeObject() 메서드 내에서 호출되며, serialPersistentFields에 명시된 필드들을 직렬화합니다.
- putFields() 메서드를 통해 필드들을 설정하고, writeFields() 메서드를 호출하여 직렬화합니다.

private void writeObject(ObjectOutputStream out) throws IOException {
    ObjectOutputStream.PutField fields = out.putFields(); // 직렬화할 필드들 설정
    fields.put("intValue", intValue);
    out.writeFields(); // 필드들을 직렬화
    // 추가적인 직렬화 로직
}

 

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

상속받은 OutputStream의 메서드로, 바이트 스트림에 데이터를 쓰기 위해 사용됩니다.

byte[] data = "Hello, ObjectOutputStream!".getBytes();
oos.write(data, 0, data.length);

 

 

ObjectOutputStream 사용 시 주의사항

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

private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject(); // 기본 필드들을 직렬화
    // 추가적인 직렬화 로직
}

 

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

 

With ChatGPT

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

자바 직렬화 transient  (0) 2023.11.27
자바 직렬화 Serializable  (0) 2023.11.26
자바 ObjectInputStream  (0) 2023.11.26
자바 직렬화(Serialization)  (0) 2023.11.26
자바 File  (0) 2023.11.26