Skip to content

[Item86] Serializable 을 구현할지는 신중히 결정하라 #140

Description

@itsjustsora

## 목표

직렬화 구현 시 장기적인 관점을 고려해야 하는 이유를 알아보자.


## 핵심 요약

  • 직렬화된 클래스는 공개 API가 되므로 수정이 어렵기 때문에 설계 시 신중해야 한다.
  • 역직렬화로 불변식이 깨질 위험이 있으며, 보안 취약점이 존재한다.
  • 상속용 혹은 내부 클래스는 직렬화를 피하고, 정적 멤버 클래스만 허용하는 것이 좋다.

## Topics

SerialVersionUID 관리 - 2가지 방법

[1] 수동

  • 직렬화 클래스에 개발자가 직접 명시해 주는 것이다.
  • 장점
    • 클래스의 내용이 변경되어도 시스템이 자동 생성하는 값으로 변경되지 않는다.
    • 런타임에 SUID를 생성하는 시간을 줄일 수 있다.

[2] 자동

  • 시스템이 자동으로 생성해준다.
  • 장점
    • 클래스 간에 중복된 값이 생기지 않게 할 수 있다.

주의해야 하는 상황
직렬화 가능 클래스에서 멤버 변수의 타입이 바뀔 때 예외가 발생할 수 있다. 하지만 그외의 경우라도 클래스가 자주 변경될 소지가 있다면 직렬화를 사용하지 않는 것이 좋다.


직렬화에서 발생하는 예외

[1] InvalidClassException

  • 클래스의 SerialVersinUID 가 다른 경우
  • 클래스에 다른 데이터 타입을 포함한 경우
  • 기본 생성자가 없는 경우 (부모 클래스는 직렬화 구현 X, 하위 클래스는 직렬화를 구현했을 때 역직렬화하는 과정 중 발생)

[2] NotSerializableException

  • Serializable을 구현하고 있찌만 다른 클래스의 객체를 참조 변수로 가지고 있거나, 그 참조하는 클래스가 직렬화를 구현하지 않았을 경우 발생한다.
  • 해당 클래스도 직렬화를 구현하도록 하거나, transient 키워드를 통해 직렬화 제외 설정을 해줘야 한다.

참고

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