Skip to content

[Item87] 커스텀 직렬화 형태를 고려하라 #141

Description

@itsjustsora

## 목표

자바의 기본 직렬화 형태와 커스텀 직렬화 형태를 알아보자


## 핵심 요약

  • 자바의 기본 직렬화 형태는 객체를 직렬화한 결과가 해당 객체의 논리적 표현에 부합할 때 사용하자.
  • 부합하지 않을 때는 커스텀 직렬화 형태를 고려하자.

## Topics

defaultWriteObject(), defaultReadObject()

[1] defaultWriteObject()

  • ObjectOutputStream의 메서드
  • 기본 직렬화 형태를 사용해 클래스에서 직렬화가 가능한 필드를 자동으로 저장한다.
  • transient로 선언된 필드는 직렬화되지 않는다.
private void writeObject(ObjectOutputStream s) throws IOException {
    s.defaultWriteObject(); // 기본 직렬화 수행 (transient 필드는 제외)
    s.writeInt(size); // 추가로 직렬화해야 할 데이터 직접 저장
}

[2] defaultReadObject()

  • ObjectInputStream의 메서드
  • 기본 직렬화 형태를 사용해서 객체를 복원한다. (defaultWriteObject()로 직렬화된 데이터 기반)
  • transient 필드는 기본값으로 초기화되므로, 필요하면 별도로 추가 로직을 작성해야 한다.
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
    s.defaultReadObject(); // 기본 역직렬화 수행 (transient 필드는 제외)
    int numElements = s.readInt(); // 추가로 저장된 데이터 읽기
    
    // transient 필드 - 기본값 초기화 대신 원하는 로직 추가 가능
    for (int i = 0; i < numElements; i++) {
        add((String) s.readObject());
    }
}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions