자바 대상 의 직렬 화 를 왜 SerialversionUID 를 사용 하 는 지 자세히 알 아 보기
5787 단어 Java대상 서열 화SerialversionUID
-대상 을 바이트 시퀀스 로 바 꾸 는 과정 을 대상 의 직렬 화 라 고 한다.
-바이트 서열 을 대상 으로 복원 하 는 과정 을 대상 의 반 서열 화 라 고 한다.
대상 의 서열 화 는 주로 두 가지 용도 가 있다.
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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.