자바 대상 의 직렬 화 를 왜 SerialversionUID 를 사용 하 는 지 자세히 알 아 보기

1.우선 왜 대상 을 직렬 화 하 는 지 이야기 합 니 다.
-대상 을 바이트 시퀀스 로 바 꾸 는 과정 을 대상 의 직렬 화 라 고 한다.
-바이트 서열 을 대상 으로 복원 하 는 과정 을 대상 의 반 서열 화 라 고 한다.
대상 의 서열 화 는 주로 두 가지 용도 가 있다.
1)대상 의 바이트 시퀀스 를 하 드 디스크 에 영구적 으로 저장 하고 보통 파일 에 저장 합 니 다.
2)네트워크 에서 전송 대상 의 바이트 시퀀스.
많은 응용 프로그램 에서 일부 대상 을 직렬 화하 여 메모리 공간 에서 벗 어 나 물리 하 드 디스크 에 입주 하여 장기 적 으로 저장 할 수 있 도록 해 야 한다.예 를 들 어 가장 흔히 볼 수 있 는 것 은 웹 서버 의 Session 대상 이다.10 만 명의 사용자 가 동시에 방문 하면 10 만 개의 Session 대상 이 나타 날 수 있 고 메모리 가 견 딜 수 없 을 수도 있다.그래서 웹 용 기 는 일부 seesion 을 먼저 하 드 디스크 에 직렬 화하 고 사용 하려 면 하 드 디스크 에 저 장 된 대상 을 메모리 에 복원 한다.
두 프로 세 스 가 원 격 통신 을 할 때 서로 다양한 종류의 데 이 터 를 보 낼 수 있다.어떤 유형의 데이터 든 이 진 시퀀스 로 네트워크 에 전송 된다.발송 자 는 이 자바 대상 을 바이트 시퀀스 로 변환 해 야 네트워크 에서 전송 할 수 있 습 니 다.수신 자 는 바이트 시퀀스 를 자바 대상 으로 복원 해 야 합 니 다.
2.SerialversionUID 를 왜 사용 합 니까?
Serializable 인터페이스 에 대한 설명 을 간단하게 보 겠 습 니 다.
If a serializable class does not explicitly declare a serialVersionUID,
then the serialization runtime will calculate a default
serialVersionUID value for that class based on various aspects of the class,
as described in the Java(TM) Object Serialization Specification.
사용자 가 serialVersionUID 를 설명 하지 않 으 면 인 터 페 이 스 는 기본적으로 serialVersionUID 를 생 성 합 니 다.
However, it is stronglyrecommended that all serializable classes explicitly declareserialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassException s during deserialization.
그러나 사용자 가 serialVersionUID 를 사용자 정의 하 는 것 을 강력 히 권장 합 니 다.기본 적 인 serialVersinUID 는 class 의 디 테 일 에 민감 하기 때문에 역 직렬 화 시 InvalidClassException 이 이상 할 수 있 습 니 다.
e.g:1.기본 serialVersion UID 사용 하기
우 리 는 먼저 실체 클래스 Person 을 만들어 Serializable 인 터 페 이 스 를 실현 합 니 다.

public class Person implements Serializable {
  

  private int age;
  private String name;
  private String sex;
 

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}
그리고 직렬 화 와 반 직렬 화 를 하 세 요.

public class Person implements Serializable {
  

  private int age;
  private String name;
  private String sex;
 

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}
결 과 는 그림 과 같다.
这里写图片描述
  e.g:2
만약 우리 가 먼저 서열 화 에 최선 을 다 한 후에 반 서열 화 전에 Person 류 를 수정 했다 면 어떻게 되 었 을 까?

public class Person implements Serializable {
  
  private int age;
  private String name;
  private String sex;
  private String address;

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}

실행 결과
这里写图到底片描述  
Person 클래스 를 수정 할 때 Person 클래스 에 대응 하 는 SerialversionUID 도 변 했 고,직렬 화 와 역 직렬 화 는 SerialversionUID 를 비교 해서 이 루어 졌 으 며,SerialversionUID 가 일치 하지 않 으 면 역 직렬 화 에 성공 할 수 없 음 을 알 수 있 습 니 다.실제 생산 환경 에서 우 리 는 일련의 중간 Object 를 만들어 서 우리 의 pojo 를 역 직렬 화 할 수 있 습 니 다.이 문 제 를 해결 하기 위해 서 는 실체 류 에서 SerialversionUID 를 사용자 정의 해 야 합 니 다.
e.g:3 Person 클래스 에 사용자 정의 SerialversionUID 추가

public class Person implements Serializable {
  
  private static final long serialVersionUID = -5809782578272943999L;
  private int age;
  private String name;
  private String sex;
  private String address;

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}
우리 가 서열 화 된 후에 어떻게 우리 의 Person 을 변경 하 든(기 존 필드 를 삭제 하지 않 음)결국 반 서열 화 에 성공 할 수 있 습 니 다.
자바 대상 의 직렬 화가 왜 SerialversionUID 를 사용 하 는 지 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 자바 대상 의 직렬 화 SerialversionUID 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기