serializable
자바에서 입출력에 사용되는 것은 스트림이라는 데이터 통로를 통해 이동한다.하지만 객체는 바이트형이 아니기 때문에 스트림을 통해 파일에 저장하거나 네트워크로 전송할 수 없다. 따라서 객체를 스트림을 통해 입출력하려면 바이트 배열로 변환하는 것이 필요한데, 이를 직렬화라고 한다. 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 한다.
직렬화 조건
- 기본형 타입은 직렬화가 가능하다.
- Serializable인터페이스를 구현한 객체여야 한다.
- transient가 사용된 멤버는 전송되지 않는다.
transient : Serializable에서 제외시키고 싶을 때 사용하는 keyward. - 생성자나 메소드는 직렬화 대상에 속하지 않는다.
선언해야하는 이유
JVM은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여한다. 만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 번호를 할당한다. 그래서 직렬화할 때의 버전 번호와 역직렬화를 할 때의 버전 번호가 다르면 역직렬화가 불가능해 질수도 있다. 이런문제를 해결하기 위해 SerialVersionUID를 사용한다.
간단명료하게 SerialVersionUID값을 저장할 때 클래스 버전이 맞는지 확인하기 위한 용도이다. 만약 직렬화할 때 사용한 SerialVersionUID의 값과 역직렬화 하기 위해 사용했던 SerialVersionUID값이 다르다면 InvalidClassException이 발생할 수 있다.