직렬화 클래스에서 serialVersionUID를 명시적으로 선언해야 하는 이유

Java 2007. 12. 10. 12:29
Serializable 인터페이스를 구현한 클래스는 자신의 serialVersionUID를 명시적으로 선언할 수 있는데, 필드의 이름은 "serialVersionUID"이며, static, final 이어야 하며 long타입이다.

예) private(추천) static final long serialVersionUID = 42L;

만일 serialVersionUID를 지정하지 않으면 실행시점에서 serialization을 담당하는 모듈이 디폴트 값을 산정하게 되며, 그 알고리즘은 Java(TM) Object Serialization Specification 정의된 것을 따른다. 그러나 모든 serialization이 필요한 클래스에 명시적으로 serialVersionUID 값을 선언해줄 것을 강력하게 권유한다. 그 이유는 디폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 deserialization(serialization 했던 객체를 복구하는 과정)과정에서 예상하지 못한 InvalidClassExceptions을 유발할 수 있다.
그러므로, 서로 다른 자바 컴파일러 구현체 사이에서도 동일한 serialVersionUID 값을 얻기 위해서는 명시적으로 serialVersionUID 값을 선언해야 한다.가능한 serialVersionUID을 private으로 선언하기를 권장한다. 상속되어 쓰여지는 것은 유용하지 않고, 해당 클래스에서만 쓰일 것이기 때문이다.

원문: 출처는 Serializable 인터페이스 API
A serializable class can declare its own serialVersionUID explicitly by declaring a field named "serialVersionUID" that must be static, final, and of type long:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, 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 InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class--serialVersionUID fields are not useful as inherited members.

설정

트랙백

댓글