Home serialVersionUID의 변경 조건은 어떻게 될까?
Post
Cancel

serialVersionUID의 변경 조건은 어떻게 될까?

글을 작성하게 된 계기


serialVersionUID의 변경 조건을 알게 됐고, 이를 정리하기 위해 글을 작성하게 되었습니다.





1. serialVersionUID의 변경 조건


자바 직렬화에서 사용하는 serialVersionUID는 직렬화된 객체와 해당 객체를 복원할 클래스 간 버전 호환성을 검사할 때 사용됩니다. 이 값은 클래스 이름, 상속 구조, 인터페이스, 필드, 메서드 등 클래스 구조를 기준으로 자동 생성됩니다. 자바 Docs에서는 일반적으로 값을 명시적으로 선언할 것을 권장합니다.

It is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected serialVersionUID conflicts during deserialization, causing deserialization to fail.



자동 생성된 serialVersionUID는 클래스 구조에 변경이 생기면 달라지게 됩니다. 클래스 구조 변경에는 필드 삭제, 필드 타입 변경, static/transient 처리, 상속 구조 변경, Serializable 인터페이스 추가/제거, writeObject/readObject 메서드 추가/제거, 메서드 시그니처 변경, 클래스 이름 변경 등이 있으며, SUID 값이 변경되면 이전 버전과의 역직렬화 호환이 깨질 수 있습니다. 이 경우 java.io.InvalidClassException 이 발생하게 됩니다.

The serialVersionUID is computed using the signature of a stream of bytes that reflect the class definition. The National Institute of Standards and Technology (NIST) Secure Hash Algorithm (SHA-1) is used to compute a signature for the stream.



반대로 필드 추가, 접근 제어자 변경, writeObject/readObject 메서드 단순 추가, Serializable 구현 추가 등은 SUID에 영향을 주지 않는 호환 가능한 변경입니다. 이런 경우, 새로 추가된 필드는 기본값으로 초기화되고, 기존 필드에는 영향이 없기 때문에 호환성이 유지됩니다. writeObject/readObject 메서드 단순 추가는 기존 포맷을 깨지 않는 재정의 입니다.

The values input to the stream are defined by the JavaTM Virtual Machine (VM) specification for classes. Class modifiers may include the ACC_PUBLIC, ACC_FINAL, ACC_INTERFACE, and ACC_ABSTRACT flags; other flags are ignored and do not affect serialVersionUID computation. Similarly, for field modifiers, only the ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, and ACC_TRANSIENT flags are used when computing serialVersionUID values.







2. 정리


serialVersionUID는 직렬화 대상 클래스의 버전 식별자이며, 클래스의 변경이 직렬화 호환성에 영향을 줄 경우 자동으로 값이 달라지게 됩니다. 이를 사용할 때, 예기치 않은 호환성 문제를 피하기 위해 명시적으로 값을 고정하는 것이 좋습니다.


This post is licensed under CC BY 4.0 by the author.

쿼츠를 사용해야 하는 이유, 다른 스케줄링 시스템과의 비교

기술도 중요하지만 비즈니스는 더 중요하다