데이타(객체)의 전송은 결국 바이트의 흐름으로 전송하게 된다. 저장하고 다시 읽었을 때 객체의 자료구조를 그대로 보존하지 않으면 않된다.(일명 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으로 추가해주면 된다.
'Java > Input/Output Facilities' 카테고리의 다른 글
바이트 Stream과 문자 스트림 (0) | 2013.11.11 |
---|---|
[바이트 스트림] 데이터 압축 및 해제 - GZIPOutputStream & GZIPInputStream 사용 (0) | 2013.02.11 |
[객체 스트림] 객체 Write & 객체 Read (0) | 2013.02.11 |
[문자 스트림] 배열형태로 만든후 내용을 화면으로 출력- CharArrayReader와CharArrayWriter의 사용 (0) | 2013.02.11 |
[문자 스트림] 키보드로부터 한줄씩읽어 파일저장 - BufferedReader와PrinterWriter의 사용 (1) | 2013.02.11 |