이클립스(JDK 1.5 이상)에서 java.io.Serializable 인터페이스를 구현한 클래스를 작성할때마다 serialVersionUID를 생성하라는 경고가 뜬다. 처음에는 아무런 생각없이 무시하고 넘어갔었는데, 새롭게 프로젝트에 투입되어 선임 개발자가 작성한 소스를 보다가 도메인Domain 객체마다 선언되어 있는 serialVersionUID를 보면서 '어따 쓰는거지?'라는 궁금증이 생겨 여쭤보았다.
serialVersionUID == '분산처리 환경에서 유일한Unique 클래스라는 것을 증명하기 위한 신분증'
이라고 간략히 정의를 내렸다.

  참고사이트 : http://docs.xrath.com/java/se/6/docs/ko/api/index.html
  여기서 Serializable 인터페이스에 대한 설명을 볼 수 있다. 다만, 영어를 번역한 일어를 한글로 번역한 것이라 글의 설명이 어려운 느낌이다. 그래서 조금 순화해서 다시 써봤다.
 
  직렬화 런타임은, 각 직렬화가능Serializable 클래스에 버전번호serialVersonUID를 설정한다. 이 serialVersionUID는, 직렬화 복원 중에 직렬화객체의 송신측과 수신측이 사용하는 객체가 직렬화에 호환성이 있는 클래스인지를 확인하는 용도로 사용된다. 송신측에서 보낸 serialVersionUID와 다른 serialVersionUID를 가지는 객체를 수신측이 로드했을 경우, 직렬화 복원 중에 InvalildClassException이 발생한다.
필드명 serialVersionUID를 선언하게되면 직렬화가능Serializable 구현 클래스는, 중복되지 않는 독자적인 serialVersionUID를 가지게 된다.
※  serialVersionUID는 반드시 static final long 형으로 선언되어야 한다.

  Serializable 구현 클래스가 SerialVersionUID를 명시적으로 선언하지 않는 경우, 직렬화 런타임은 「Java(TM) 객체 직렬화 스펙」에서 설명된 것처럼, 클래스의 다양한 측면들을 근거로 클래스 serialVersionUID의 디폴트 값을 선언하여 사용할 수 있다. 그러나 가능하면 모든 직렬화 가능 클래스가 명시적인 serialVersionUID를 선언하는 것을 강력 추천(IDE에서 generate하여 선언)합니다.
  이것은, 디폴트의 serialVersionUID의 계산이, 컴파일러의 구현에 따라서 달라질 직렬화가능Serializable 클래스가 영향을 받기 쉽고, 직렬화 복원 중에 예기치않는 InvalidClassException을 발생시킬 수 있기 때문입니다. 따라서, Java 컴파일러에 상관없이 serialVersionUID의 일관성을 확보하기
위해서, 직렬화 가능Serializable 구현 클래스에서는 명시적으로 serialVersionUID를 명시적으로 선언하도록 하자.
  추가적으로, serialVersionUID의 명시적 선언에는 private 수식자를 사용하는 것을 추천합니다. 이 선언자를 사용하면, 이 속성에 대한 선언이 해당 클래스에만 적용되기 때문입니다. 즉, serialVersionUID 필드 값이 상속되지 않는다(serialVersionUID는 유일해야 한다).
  배열클래스는 serialVersionUID를 명시적으로 선언할 수 없기 때문에, 디폴트 값을 사용한다.

  IDE 내에서 serialVersionUID 선언 방법
 
1. 클래스에 Serializable 인터페이스를 구현하겠다고 선언한다.

2. Quick Fix(Ctrl+1)을 실행하고 Add generated serial versio ID(AspectJ)를 클릭한다.

3. 위의 사진처럼 private static final long serialVersionUID = 5294335241519103532L; 선언된 것을 확인할 수 있다.



나중에 추가적으로 더 알게되는 내용이나 잘못된 내용은 업그레이드 하겠습니다.

+ Recent posts