ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 직렬화 & 역직렬화(3)_버전 관리
    Java 2023. 10. 9. 13:49

    직렬화 버전 관리

    • Serializable 인터페이스를 구현하는 모든 직렬화된 클래스는 serialVersionUID(이하 SUID) 이라는 고유 식별번호를 부여 받는다
      • 식별 ID는 클래스를 직렬화, 역직렬화 과정에서 동일한 특성을 갖는지 확인하는데 사용
    • 클래스 내부 구성이 수정될 경우, 기존에 직렬화한 SUID와 현재 클래스의 SUID 버전이 다르기 때문에 이를 인지하고 InvalidClassException 예외가 발생시켜 값 불일치 되는 현상을 미연에 방지한다.
    • 클래스에 SUID 필드를 명시하지 않는다면, 시스템이 런타임에 클래스의 이름, 생성자 등과 같이 클래스의 구조를 이용해 암호 해시함수를 적용해 자동으로 클래스 안에 생성하게 된다.

     

    직렬화 버전 수동 관리

    • 직렬화 클래스는 왠만한 상황에선 serialVersionUID 를 직접 명시해주어 클래스 버전을 수동으로 관리하는 것을 권장하는 편이다.
    • 네트워크로 객체를 직렬화하여 전송하거나 협업을 하는 경우 수신자와 송신자 모두 같은 버전의 클래스를 가지고 있어야 할텐데, 만일 클래스가 조금만 변경사항이 있으면 모든 사용자에게 재배포해야 하는 애로사항이 생겨 프로그램을 관리하기 어렵게 만든다.
      • SUID를 직접 명시해주면 클래스의 내용이 변경되어도, 클래스의 버전이 시스템이 자동 생성된 값으로 변경되지 않기 때문에 수동으로 관리하는 것을 권장한다.
      • 런타임에 SUID를 생성하는 시간도 많이 잡아먹기 때문에 수동으로 관리하는 것을 권장한다.
    class Board implements Serializable {
        // serialVersionUID 꼭 명시 할 것
        // private static final 제어자로 선언해야 하며 타입은 long 이다.
        private static final long serialVersionUID = 123L;
        
        private int seq;
        private String title;
        ...
    }

     

    주의 사항

    • 자주 변경될 소지가 있는 클래스의 객체는 그냥 직렬화를 사용하지 않는 것이 좋다.
    • serialVersionUID는 정수값이라 어떠한 값으로도 지정할 수 있지만, 단순한 값이면 겹칠 우려가 있기 때문에 서로 다른 클래스간에 같은 값을 갖지 않도록 serialversion 값을 생성해주는 프로그램을 사용하는 것이 좋다.
    • 데이터 타입을 업데이트하고 역직렬화를 해보면 incompatible type 에러가 발생하게 된다.
    • 직렬화 사용할 때, 예외가 발생하거나 주의해야 할 상황
      1. 멤버 변수를 추가할 때 (영향 없음 - 기본값으로 설정)
      2. 멤버 변수가 삭제될 때  (영향 없음)
      3. 멤버 변수의 이름이 바뀔 때 (영향 없음 - 값이 할당되지 않음)
      4. 멤버 변수의 접근 제어자 변경 (영향 없음)
      5. 멤버 변수에 static 와 transient 추가  (영향 없음)
      6. 멤버 변수의 타입이 바뀔 때  (영향 있음)

     

     

    출처)

    https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A7%81%EB%A0%AC%ED%99%94Serializable-%EC%99%84%EB%B2%BD-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0

Designed by Tistory.