Serializable

Serializable 기본

  • 기존의 자바의 클래스들을 살펴보며 Serializable 인터페이스를 확장한 모습을 많이 볼 수 있었다.

  • 해당 인터페이스는 구현해야 할 메서드가 없다...

  • 해당 인터페이스를 확장하는 것 만으로 파일 I/O, 네트워킹 프로그래밍이 가능해진다.

  • 해당 인터페이스를 확장 후 다음과 같이 serialVersionUID 값을 지정해주는 것을 권장한다.

    • 만약 지정하지 않는다면, 자바 소스가 컴파일 될 때 자동으로 생성된다.

    • 반드시 아래와 같은 형식으로 지정해야만 자바에서 인식한다.

static final long serialVersionUID = 1L;
  • 왜 위와 같은 값을 지정해야할까?

    • 이 값은, 해당 객체의 버전을 명시하는데 사용된다.

    • 예를 들어, A 서버가 B서버로 SampleDTO 객체를 전송하려 할때, 두 서버 모두에 SampleDTO 를 가지고 있을 때

    • 만약 A 서버 SampleDTO 가 3개의 변수, B 서버 DTO 가 4개의 변수를 가지고 있는다고 하면, serialVersionUID 값에 따라서 다른 클래스로 인식한다.

    • 즉, 클래스 이름이 같더라도, 해당 UID 가 다르면, 다른 클래스로 인식한다.

    • 또, 같은 UID라 하더라도, 변수의 개수, 타입이 다르면 다른 클래스로 인식한다.

객체를 저장하자

  • 다음과 같이 DTO 객체를 만들고

    • Serializable 인터페이스를 구현하지 않았다면 I/O & 네트워크 통신 시 정상적으로 실행되지 않는다..

    • NotSerializableException 에러를 발생시킨다.

    • I/O & 네트워크 통신 시에는 Serializable 인터페이스 구현이 필수적이다.

  • 다음과 같이 데이터를 쓰고, 읽는 클래스를 만들자

Serializable 를 구현한 클래스르 변경해보자

  • 다음과 같이 인스턴스 변수를 추가 후 실행 시 InvalidClassException 에러가 난다.

  • 이유는, 같은 UID라 하더라도, 변수의 개수, 타입 등이 다르면 다른 클래스로 인식한다.

  • 다음과 같이, serialVersionUID 를 명시적으로 선언한 것 같이, 다른 객체로 인식하게 된다.

  • 만약 데이터가 변경되면 다음과 같이 serialVersionUID를 명시적으로 선언하는 것이 권장된다.

transient 라는 예약어는 Serializable 과 뗄 수 없는 관계다

  • transient 예약어를 사용하게 되면, Serializable 대상에 제외가 된다! (꼭 기억하자!)

  • 비밀번호와 같이 개인정보는 I/O 대상에서 제외할 필요가 있다.

Last updated