2017-02-02 12 views
3

기본 serialVersionUID 또는 java에 serialVersionUID이 생성 된 정확한 위치를 모르십니까?기본값과 생성 된 직렬 버전 uid가 java에서 다른 점은 무엇입니까?

private static final long serialVersionUID = 4125965356358329466L; // generated 
private static final long serialVersionUID = 1L; // default 
+0

[직렬화에 직렬 버전이 필요한 이유는 무엇입니까] (http://stackoverflow.com/questions/5576047/why-does-serialization-require-a-serial-version-uid-in-implemented-class) – AxelH

답변

2

직렬 버전 ID는 개체 직렬화 및 역 직렬화에 사용됩니다. Java에서는, 직렬화 복원하는 바이트가 로컬 클래스의 버젼과 일치할지 어떨지를 확인합니다. 그렇지 않은 경우는, 예외가 슬로우됩니다. 이것은 RMI 또는 지속되는 객체 구조를 수행 할 때 중요합니다. 직렬화 런타임은 각 직렬화 가능 클래스와 serialVersionUID라는 버전 번호 인 을 직렬화하는 동안 직렬화 된 객체의 송신자와 수신자가 직렬화와 관련하여 해당 객체에 대한 클래스를로드했는지 확인하기 위해 사용됩니다.

0

실용적인 차이점이 없습니다. 수업을 변경할 때 번호를 변경 (증분)하는 한 괜찮습니다.

1

Serializable 클래스에 serialVersionUID을 제공하지 않으면 Java는 해당 클래스의 세부 정보를 기반으로 사용자를 대신하여 serialVersionUID을 생성합니다. 일부 IDE 및 기타 도구는 동일한 계산을 수행하여 명시 적으로 생성 된 serialVersionUID을 클래스에 넣을 수 있습니다. 대부분의 경우 다소 까다로울뿐 아니라 종종 할 수있는 것처럼 이전 버전과의 직렬화 호환성을 유지하면서 클래스를 변경하려는 경우이 작업을 수행하는 것이 유용합니다.

serialVersionUID을 수동으로 관리하는 경우 일반 시리얼 번호를 사용하는 것이 더 쉬우 며 1에서 시작하여 클래스가 변경 될 때마다 증가됩니다 직렬화 호환성을 깨뜨리는 방식으로. 그래도이 문제가 생기면 을 수행하고을 올바르게 수행하십시오. 즉 적절할 경우 serialVersionUID을 변경하십시오. 그렇지 않으면 전체 목적을 상실합니다.

+0

기본 ID 생성에서 구현의 차이점을 알 수 있습니다. 당신은 serializer와 deserializer가 같은 provider/version의 JVM을 사용한다는 것을 확실히 알아야 할 것이다. –

+0

그렇지 않습니다. @JanLarsen. 디폴트'serialVersionUID'를 계산하기위한 알고리즘은 표준화되어 있습니다. 직렬화 가능 클래스가 serialVersionUID를 명시 적으로 선언하지 않으면 직렬화 런타임은 클래스의 다양한 측면을 기반으로 해당 클래스의 기본 serialVersionUID 값을 계산합니다. **로 java.io.Serializable을 설정합니다. Java (TM) Object Serialization Specification ** "(강조 추가)에 설명되고 있습니다. 특히 https://docs.oracle.com/javase/7/docs/platform/serialization/spec/class.html#4100을 참조하십시오. –