Language/JAVA

serialVersionUID 용도

적외선 2014. 11. 14. 15:00


serialversionutil-civan.zip


1. Serialization 이란?

 

  모든 데이터의 흐름은 바이트 전송으로 이루어 집니다. 이것은 객체도 마찬가진데, 이때 사용되는 개념이 Serialization 이라는 것이고 자바에서는 java.io.Serializable 이라는 interface입니다.

이것을 사용하는 방법은 implements Serializable 이라고 class명 옆에다 추가만 해주면 됩니다. 그런데, 클래서를 선언하면 static final long 타입의 serialVersionUID 상수를 선언하라는 경고문구를 
이클립스의 노란 warning 아이콘과 더불어 확인 할 수 있습니다.

 

2. serialVersionUID 용도는?

 

만일 serialVersionUID를 지정하지 않으면 실행시점에서 JVM이 디폴트 값을 산정하게 되며, 
그 알고리즘은 Java(TM) Object Serialization Specification 정의된 것을 따른다고 합니다. 
한마디로 굳이 신경 쓸필요는 없다는 뜻이고 이클립스내에서 이 경고아이콘을 제외하도록 설정할 수도 있습니다.

그러나 모든 serialization이 필요한 클래스에는 명시적으로 serialVersionUID를 선언해줄것을 강력하게 권유하고 있는데 그 이유는 디폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 deserialization(serialization 했던 객체를 복구하는 과정)과정에서 예상하지 못한 InvalidClassExceptions을 유발할 수 있다 라는 것이 그 이유입니다.

즉 서로 다른 자바 컴파일러 구현체 사이에서도 동일한 serialVersionUID값을 얻기 위해서는 명시적으로 serialVersionUID값을 선언해야 하며 가능한 serialVersionUID을 private으로 선언하라는 것입니다.

 

3. 쉽게하는 방법은?

 

그러나, 이것을 간단히 할 수 있는 방법은 serialver.exe를 사용하는 것입니다.

첨부파일을 압축을 풀고 이클립스 플러그인 디렉토리에 넣어두면 자동생성 플러그인 설치는 끝
3.3에서도 이상없이 작동한다. 사용방법은 다음과 같다.
파일을 선택 마우스 오른클릭하면
Add serialVersionUID 라는 메뉴가 추가 되어 있는것을 확인할 수 있다. 



import java.io.Serializable;

public class APIJson implements Serializable {

 /**
  *   아래 참조....
  */   
 private static final long serialVersionUID = 5005432000206295213L;

}




출처 - http://softlife.tistory.com/category/%EA%B0%9C%EB%B0%9C%EB%8F%84%EA%B5%AC/Eclipse