java 에서 직렬 화 serialVersionUID
많은 응용 프로그램 에서 일부 대상 을 직렬 화하 여 메모리 공간 에서 벗 어 나 물리 하 드 디스크 에 입주 하여 장기 적 으로 저장 할 수 있 도록 해 야 한다.예 를 들 어 가장 흔히 볼 수 있 는 것 은 웹 서버 의 Session 대상 입 니 다. 10 만 명의 사용자 가 동시에 방문 하면 10 만 개의 Session 대상 이 나타 날 수 있 습 니 다. 메모리 가 견 딜 수 없 을 수도 있 습 니 다. 그래서 웹 용 기 는 일부 seesion 을 메모리 에 서열 화하 고 사용 하려 면 대상 에 복원 합 니 다. 다시 말 하면 2 진 파일 을 메모리 의 대상 으로 바 꿀 수 있 습 니 다.JAVA 에서 이러한 메커니즘 을 실현 하려 면 Serializable 인 터 페 이 스 를 실현 하면 됩 니 다. 먼저 아래 의 간단 한 예 를 보 세 요. serial Versionuid 는 잠시 후에 이 끌 어 냅 니 다.우 리 는 먼저 간단 한 Person 클래스 를 정의 한 다음 에 이 대상 을 만 들 고 마지막 으로 파일 로 정렬 합 니 다.
import java.io.Serializable;
public class Person implements Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class WhySerialversionUID {
public static void main(String[] args) throws Exception {
//
Person crab = new Person();
crab.setName("Mr.Crab");
ObjectOutputStream oo = new ObjectOutputStream
(new FileOutputStream("crab_file"));
oo.writeObject(crab);
oo.close();
// , ,
//ObjectInputStream oi = new ObjectInputStream
// (new FileInputStream("crab_file"));
//Person crab_back = (Person) oi.readObject();
//System.out.println("Hi, My name is " + crab_back.getName());
//oi.close();
}
}
운행 이 끝 난 후, 우 리 는 crab 가 있 는 것 을 발견 하 였 다.file 파일, 이 파일 은 이 crab 대상 이 메모리 에 있 는 형 태 를 저장 합 니 다.마찬가지 로, 우 리 는 이 부분 코드 를 주석 하여 아래 의 복원 코드 를 실행 하 였 는데, 발견, crabfile 파일 은 대상 으로 바 뀔 수 있 습 니 다.
모든 것 이 그렇게 순 조 롭 지만 서열 화 된 후에 Person 이라는 종류 가 바 뀌 었 다 면?예 를 들 어 구성원 변수 가 하나 더 생 겼 다.우 리 는 다음 과 같은 시험 을 할 것 입 니 다. 먼저 대상 을 하나의 파일 에 정렬 한 다음 에 Person 클래스 에 구성원 변 수 를 추가 할 것 입 니 다. 다음 과 같 습 니 다.
import java.io.Serializable;
public class Person implements Serializable {
private String name;
//
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
그 후에 우 리 는 다시 복원 을 실행 하면 운행 이 잘못 되 었 다 는 것 을 알 게 되 고 다음 과 같은 오 류 를 보고 할 것 이다.
Exception in thread “main” java.io.InvalidClassException: Person; local class incompatible: stream classdesc serialVersionUID = 8383901821872620925, local class serialVersionUID = -763618247875550322
파일 흐름 에 있 는 class 와 classpath 에 있 는 class, 즉 수 정 된 class 는 호 환 되 지 않 고 보안 메커니즘 을 고려 하여 프로그램 이 오 류 를 던 지고 불 러 오 기 를 거부 한 다 는 뜻 입 니 다.그렇다면 우리 가 정말 직렬 화 된 후에 필드 나 방법 을 추가 해 야 한다 면?어떻게 해 야 돼 요?그것 은 바로 스스로 serial Version UID 를 지정 하 는 것 이다.이전에 우리 의 예 에서 우 리 는 serial Versionuid 를 지정 하지 않 았 다. 그러면 자바 컴 파일 러 는 자동 으로 이 class 에 요약 알고리즘 을 진행 할 것 이다. 지문 알고리즘 과 유사 하 다. 이 파일 에 빈 칸 이 하나 더 있 으 면 얻 은 UID 는 전혀 다 를 것 이다. 이렇게 여러 가지 중에서 이 번 호 는 유일 하 다 는 것 을 보증 할 수 있다.그래서 우 리 는 필드 를 추가 한 후에 serial VersionUID 가 지정 되 지 않 았 기 때문에 컴 파일 러 는 또 하나의 UID 를 만 들 었 습 니 다. 물론 앞에서 파일 에 저 장 된 것 과 다 르 기 때문에 두 개의 번호 가 일치 하지 않 는 오류 가 발생 했 습 니 다.따라서 우리 가 serial Versionuid 를 지정 하면 직렬 화 된 후에 필드 나 방법 을 추가 할 수 있 습 니 다. 후기의 복원 에 영향 을 주지 않 고 복원 한 대상 은 그대로 사용 할 수 있 습 니 다. 그리고 사용 할 수 있 는 방법 도 많 습 니 다. 하하.근 데 serial Versionuid 는 저희 가 어떻게 만 들 죠?1 을 쓸 수도 있 고 2 를 쓸 수도 있 지만 요약 알고리즘 에 따라 유일한 지문 숫자 를 만 드 는 것 이 좋 습 니 다. eclipse 는 자동 으로 생 성 될 수 있 고 jdk 도 이 도 구 를 가지 고 있 습 니 다.유사 하 다
private static final long serialVersionUID = -763618247875550322L;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.