객체의 직렬화 & serialVersionUID
데이타(객체)의 전송은 결국 바이트의 흐름으로 전송하게 된다. 저장하고 다시 읽었을 때 객체의 자료구조를 그대로 보존하지 않으면 않된다.(일명 Serialzation) 자바에선 Serializable 인터페이스만 구현하면 알아서 이를 보장해주기에 단지 implements Serializable 만 추가하면 된다.
일전에도 언급한 적이 있지만 5.0 이후부터는 Serialzable 인터페이스를 구현한 클래스에서
The serializable class xxx does not declare a static final serialVersionUID field of type long
위와 같은 경고문구를 보았을 것이다.
만일 serialVersionUID를 지정하지 않으면 실행시점에서 JVM이 디폴트 값을 산정하게 되며,
그 알고리즘은 Java(TM) Object Serialization Specification 정의된다.
그러나 모든 serialization이 필요한 클래스에는 명시적으로 serialVersionUID를 선언해줄것을 강력하게 권유하고 있는데 그 이유는 디폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 deserialization(serialization 했던 객체를 복구하는 과정)과정에서 예상하지 못한 InvalidClassExceptions을 유발할 수 있기때문이다.
즉 서로 다른 자바 컴파일러 구현체 사이에서도 동일한 serialVersionUID값을 얻기 위해서는 명시적으로 serialVersionUID값을 선언해야 하며 가능한 serialVersionUID을 private으로 선언하라는 것이다.
(상속되어 쓰여지는 것은 유용하지 않고, 해당 클래스에서만 쓰일 것이기 때문에....)
Eclipse serialVersionUID생성 Plugin
serialver.SerialVersionPlugin 를 설치하게되면 Package Explorer나 Navigator의 뷰에서 해당 리소스를 선택하고 마우스 오른쪽 버튼을 클릭하게되면 선택된 소스에serialVersionUID를 생성하는 메뉴가 나온다. serialVersionUID를 생성하고 해당 소스에서 private으로 추가해주면 된다.