serialVersionUID란 무엇인가?
serialVersionUID는 시리얼 통신을 하는 클래스의 버전을 표시하는 것이다.
자바에서는 객체를 직렬화(Serialization)하여 바이트스트림으로 만들어서 저장한다.
이때 저장되는 바이트스트림에는 버전정보인 serialVersionUID가 포함되게 된다.
이 후 바이트스트림을 역직렬화(Deserialization)하여 자바의 객체로 만들때 버전을 체크하게되는데 이 때 사용되는 버전정보가 바로 serialVersionUID이다.
자바 직렬화란?
자바 객체를 바이트스트림으로 만들어서 파일, 데이터베이스, 메모리, 네트워크 송신이 가능하도록 하는 것이다.
자바 역직렬화란?
파일, 데이터베이스,메모리, 네트워크로 부터 수신된 바이트스트림을 자바객체로 변환하는 과정이다.
serialVersionUID는 어떻게 생성되는가?
Serializable 인터페이스를 구현하면 serialVersionUID를 만들 수 있다.
이클립스나 InteliJ 같은 모던 IDE에서는 자동으로 생성해준다.
만약 serialVersionUID를 생성하지 않는다면 자바컴파일러가 알고리즘에 따라 자동으로 생성해준다.
컴파일러가 자동으로 생성하는 방법은 클래스를 보고서 만드는데 참조하는 요소는 아래와 같다.
1. 클래스 이름 (fully qualified)
2. 클래스의 접근 제한자 (public, final, abstract, 또 interface 여부)
3. 각 멤버 필드의 시그너처 (이름과 접근 제한자, 타입)
4. 각 멤버 메소드의 시그너처 (이름과 접근 제한자, 각 인자별 정보, 리턴 타입)
4. 각 생성자의 시그너처 (접근 제한자, 각 인자별 정보)
5. static initializer block 존재 유무
따라서 컴파일러가 만들어준 serialVersionUID는 클래스가 변경 될 때 마다 달라진다.
serialVersionUID는 자동으로 생성 했을 때 문제점
컴파일러가 자동으로 serialVerionUID를 생성하게 되면 같은 클래스를 가지고 있다고 하더라도 다를 수가 있다. 왜냐하면 seiralVersionUID는 컴파일러에 의존적이기 때문이다.
아래 그림처럼 1.8 컴파일러가 버전을 100으로 부여했지만 1.7 컴파일러는 200으로 부여했다.
그래서 네트워크 송신 할 때 버전아이디가 100으로 들어갔고 역직렬화 하는과정에서 버전아이디가 일치 하지 않기 때문에 오류가 발생한다.
Exception in thread "main" java.io.InvalidClassException: cockeb.Product;
local class incompatible: stream classdesc serialVersionUID = 1288455942608122525,
local class serialVersionUID = -558553967080513790
역직렬화 오류를 회피하기 위한 방법
간단하다. 반드시 명시적으로 SerialVersionUID를 써주는 것이다.
'프로그래밍 > Java' 카테고리의 다른 글
[JAVA/자바] 공학용계산기 만들기 (0) | 2021.01.14 |
---|---|
[JAVA] 자바로 파일 읽고/쓰기에 대해 알아 보자 (0) | 2020.04.08 |
Html으 PDF로 변경하는 방법 (0) | 2020.03.13 |
[자바/JAVA] 디자인패턴 #6 데코레이터( Decorator) 패턴 (0) | 2019.01.10 |
[자바/JAVA] 디자인패턴 #6 빌더( Builder) 패턴 (0) | 2019.01.06 |