DRUNKEN KEVIN

SerialVersionUID in Serializable Interface

2010.01.12 09:43

가상



 Servlet을 구현하다가 보면, Warning 항목이 위와 같이 뜨면서, SerialVersionUID를 작성하라고 한다. 지금까지 작업을 할 때에는, 그저 무시하고 말았었는데, 웹 서비스가 실행되다가 InvalidClassException이 발생할 가능성이 있다고 한다.


 Java API에는 다음과 같이 명시되어 있다.


 직렬화 가능(Serializable) 클래스가 serialVersionUID를 명시적으로 선언하지 않는 경우, 직렬화 런타임은 「Java(TM) 객체 직렬화 스펙」에서 설명하고 있듯이, 클래스의 다양한 측면에 근거해, 클래스의 serialVersionUID의 Default 값를 계산한다. 다만, 모든 직렬화 가능 클래스가 serialVersionUID를 명시적으로 선언하는 것을 강하게 추천한다. Default의 serialVersionUID 계산이, 컴파일러의 구현에 따라서, 다를 가능성이 있는 클래스의 영향을 받기 쉽고, 직렬화 복원 중에 예기치 않은 InvalidClassException 가 발생할 가능성이 있기 때문이다. 따라서, java 컴파일러의 구현이 달라도 serialVersionUID의 일관성을 확보로 하려면, 직렬화 가능 클래스가 serialVersionUID를 명시적으로 선언하지 않으면 안된다. 또, serialVersionUID 의 명시적인 선언에서는 private 수식자를 사용하는 것을 적극 추천한다. 이러한 선언은 직접적으로 선언하는 클래스에게만 적용되게 하기 위한 것이다. private으로 선언하면, serialVersionUID 필드를 상속되는 멤버와 같이 사용하지 않는다.



 많은 개발자들이 InvalidClassException으로 질문을 게시하는 경우가 종종 있다. 원인 파악을 못하는 경우가 있었는데, 이와 같이 간단한 사항을 준수한다면, 예외발생이 적은, 좋은 프로그램이 되겠다.


'가상' 카테고리의 다른 글

이제 대세는, HTML5?  (0) 2010.02.02
Private IP Address  (1) 2010.01.20
SerialVersionUID in Serializable Interface  (0) 2010.01.12
CUDA 오류 검사 함수  (0) 2010.01.08
CUDA 개발 환경 설정하기 #2. Visual Studio 환경 설정  (0) 2010.01.02
이클립스 기반 SQL Explorer  (4) 2009.12.29