이클립스를 쓰다보면 코드엔 이상이 없는데 왠 노란색 warining 표시가 쭈욱 표시되어 있다.

표시되는것이 눈에 거슬려도 빨간색 Error도 아니고 실행엔 문제가 없기에 무시하고 넘어가곤 했는데 알고 지나가는거랑 모르고 지나는건 틀리기에 함 살펴보기로 했다


메시지를 살펴보니

warning: [serial] serializable class <CLASSNAME> has no definition of serialVersionUID 라고 되어 있다.


해석하면 직렬화 가능 클래스에서 long 유형의 static final serialVersionUID 필드를 선언하지 않습니다 라는데 serialVersionUID? 이게 머지? 이런걸 쓰이는 곳이 없는데...


알아보니 java beans 객체는 serialVersionUID 를 가지게 되는데 이것은 또한

jvm 에서 특정 객체를 인식하기 위한 UID 이기도 하다라는걸 찾게 되었다.


1.4까지는 java beans 에서 serialVersionUID를 명시하지 않아도 JVM에서 serialVersionUID 를 제네레이션 해서 관리하고 있지만 1.5 부턴 serialVersionUID를 명시하길 권고하고 있다고 하니 생각해볼 문제인듯(머 권고사항이라고 하니 기냥 무시할까나..-_-)


해결방법은 serialVersionUID 은 롱 타입의 값으로  다음과 같이 유일한 값을 지정해주면된다.

private static final long serialVersionUID = 1222179582713735628L;


단순히 이클립스 내에서 해당 warning메시지를 표시하지 않기를 원한다면

Window -> Preferences -> Java -> Compiler -> Errors/Warnings ->
Potential programming problems -> Serializable class without
serialVersionUID -> Ignore.


한글 언어팩 적용시에는
창 -> 환경설정 -> Java -> 오류/경고 -> 잠재적 프로그래밍 문제점 ->
serialVersionUID가 없는 직렬화 가능 클래스 -> 무시


를 통해서 해당 메시지를 표시하지 않게 설정할 수 있다.


---------------------------------------------------------------------------------------------

데이타의 전송은 객체건 뭐건 결국 바이트의 흐름으로 전송하게 된다. 저장도 그렇고...
다시 읽었을 때 객체의 자료구조를 그대로 보존하지 않으면 않된다.(일명 Serialzation)
자바에선 Serializable 인터페이스만 구현하면 알아서 이를 보장해주기에 단지 implements Serializable 만 추가하면 된다.
 
일전에도 언급한 적이 있지만 5.0 이후부터는 Serialzable 인터페이스를 구현한 클래스에서
 static final long 타입의 serialVersionUID 상수를 선언하라는 경고문구를
이클립스의 노란 warning 아이콘과 더불어 확인 할 수 있다.
 
만일 serialVersionUID를 지정하지 않으면 실행시점에서 JVM이 디폴트 값을 산정하게 되며,
그 알고리즘은 Java(TM) Object Serialization Specification 정의된 것을 따른다고 한다.
한마디로 굳이 신경 쓸필요는 없다는 뜻이고 이클립스내에서 이 경고아이콘을 제외하도록 설정할 수도 있다.
 
그러나 모든 serialization이 필요한 클래스에는 명시적으로 serialVersionUID를 선언해줄것을 강력하게 권유하고 있는데
그 이유는  디폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 deserialization(serialization 했던 객체를 복구하는 과정)과정에서 예상하지 못한 InvalidClassExceptions을 유발할 수 있다.
라는 것이 그 이유란다.
 
즉 서로 다른 자바 컴파일러 구현체 사이에서도 동일한 serialVersionUID값을 얻기 위해서는 명시적으로 serialVersionUID값을 선언해야 하며 가능한 serialVersionUID을 private으로 선언하라는 것이다.
(상속되어 쓰여지는 것은 유용하지 않고, 해당 클래스에서만 쓰일 것이기 때문에....)


class의 warning이 뜬 부분을 클릭 해보면 [ + Add generated serial version ID ] 나타난다 클릭하면
eclipse에서 알아서 생성 해준다.

[출처]
java warning: no definition of serialVersionUID |작성자 시반

'Java' 카테고리의 다른 글

[Java] Base64 - 2  (0) 2011.03.24
[Java] Base64 - 1  (0) 2011.03.24
[Java] JDBC -> Java DataBase Connection  (0) 2011.03.02
[Java] J2SE, J2EE  (0) 2011.02.25
[Java] Java Tutorial  (0) 2011.02.18

+ Recent posts