데이타(객체)의 전송은 결국 바이트의 흐름으로 전송하게 된다. 저장하고 다시 읽었을 객체의 자료구조를 그대로 보존하지 않으면 않된다.(일명 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으로 추가해주면 된다.

   

 

serialver.SerialVersionPlugin.zip

Posted by Steven J.S Min
,