http://www.okjsp.net/seq/234597
직렬화는 단기간 혹은 장기간 데이터를 보존하는 용도로 나눌 수 있는데, 단기 저장은 예컨대 네트워크로 전송하는 경우이고 장기 저장은 게임의 세이브 파일과 같은 용도입니다.
기본적으로 직렬화를 해제하기 위해서는 직렬화 시점의 클래스와 해제 시점의 클래스가 일치해야하는데 이는 저장 기간이 길어질수록 문제가 됩니다.
serialVersionUID를 선언하면 해당 변수의 값이 같으면 실제 클래스 내용이 바뀌어도 동일한 클래스로 간주하고 직렬화 해제를 시도합니다.
예컨대 게임 세이브 파일을 직렬화를 통해 구현했는데, 다음 버전에서 해당 클래스에 필드가 하나 추가되었다면 만일 명시적으로 serialVersionUID를 선언하지 않은 경우 업그레이드 후 이전 버전의 세이브 파일을 불러오지 못하게 됩니다.
serialVersionUID는 이러한 문제를 해결하기 위해 주로 사용합니다.
http://hyeonstorage.tistory.com/253
serialVersionUID 이란? Warning 해결하기
객체를 파일에 쓰거나 전송하기 위해서는 직렬화를 해야 하는데 그러기 위해 객체 클래스에 Serializable 인터페이스를 implements 하게 된다.
[JAVA] 객체 직렬화 ObjectInputStream / ObjectOutputStream
하지만 Serializable 인터페이스를 implements 하게 되면 노란색 Warning이 발생한다.
The serializable class *** does not declare a static final serialVersionUID field of type long
저렇게 Warning이 발생하지만 동작하는데는 문제가 없다.
그래도 계속 저렇게 Warning이 떠있는데 왜 생기는 것이며 serialVersionUID 는 무엇이길래 없다고 그러는 건가?
serialVersionUID 는 직렬화에 사용되는 고유 아이디인데, 선언하지 않으면 JVM에서 디폴트로 자동 생성된다.
따라서 선언하지 않아도 동작하는데 문제는 없지만, 불안하기 때문에 JAVA에서는 명시적으로 serialVersionUID를 선언할 것을 적극 권장하고 있다.
* JVM에 의한 디폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 deserialization 과정에서 예상하지 못한 InvalidClassException을 유발할 수 있다.
serialVersionUID는 private static final 로 선언하면 된다.
그럼 serialVersionUID는 어떻게 생성하면 될까?
이클립스에서는 serialVersionUID를 자동으로 선언해주는 플러그인 있다.
위의 파일을 다운받고 압축을 풀어서 eclipse\plugin 폴더에 넣어 놓고 이클립스를 재시작 한다.
serialVersionUID 를 생성하고자 하는 (Serializable을 implements 한) 클래스에 마우스 오른쪽 버튼을 누르면
아래 그림과 같이 Add SerialVersionUID 가 있다.
Add SerialVersionUID를 클릭하면 serialVersionUID가 생성된다.
앞에 private를 붙여서 private static final long 형태가 되도록 하자.
이제 노란 Warning이 없어지는 것을 볼 수 있다.
Warning을 없애는 방법은 SerialVersionUID 선언 외에 다른 방법이 있다.
클래스 위에 @SuppressWarnings("serial") 이라고 어노테이션 처리를 해주면 없어진다.
하지만 SerialVersionUID를 선언해주는 것이 권장되는 방법이다.
'차근차근 > JAVA JSP' 카테고리의 다른 글
init (0) | 2014.08.24 |
---|---|
ServletConfig, ServletContext (0) | 2014.08.24 |
자바 디자인 패턴 1 - Iterator (0) | 2014.08.20 |
무작정 자료 수집 (1) | 2014.07.30 |
Java! 이해하고 개발하자. ① final 에 대한 이해 (0) | 2014.07.29 |