serializable

자바에서 입출력에 사용되는 것은 스트림이라는 데이터 통로를 통해 이동한다.하지만 객체는 바이트형이 아니기 때문에 스트림을 통해 파일에 저장하거나 네트워크로 전송할 수 없다. 따라서 객체를 스트림을 통해 입출력하려면 바이트 배열로 변환하는 것이 필요한데, 이를 직렬화라고 한다. 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 한다.
직렬화2

직렬화 조건

  1. 기본형 타입은 직렬화가 가능하다.
  2. Serializable인터페이스를 구현한 객체여야 한다.
  3. transient가 사용된 멤버는 전송되지 않는다.
    transient : Serializable에서 제외시키고 싶을 때 사용하는 keyward.
  4. 생성자나 메소드는 직렬화 대상에 속하지 않는다.

선언해야하는 이유

JVM은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여한다. 만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 번호를 할당한다. 그래서 직렬화할 때의 버전 번호와 역직렬화를 할 때의 버전 번호가 다르면 역직렬화가 불가능해 질수도 있다. 이런문제를 해결하기 위해 SerialVersionUID를 사용한다.
간단명료하게 SerialVersionUID값을 저장할 때 클래스 버전이 맞는지 확인하기 위한 용도이다. 만약 직렬화할 때 사용한 SerialVersionUID의 값과 역직렬화 하기 위해 사용했던 SerialVersionUID값이 다르다면 InvalidClassException이 발생할 수 있다.