2013-07-25 2 views
4

java.java의 직렬화에 대해 읽었습니다. 정적 변수가 object.serialVersionUID와 직렬화되지 않는다고 말했습니다. 직렬화 프로세스에서 필수 항목입니다. 객체가 직렬화되면 serialVersionUID가 다른 내용과 함께 직렬화됩니다 . 이것은 "정적 필드가 직렬화되지 않는 일반적인 직렬화 규칙에 대한 한 가지 예외입니다.SerialVersionUID가 정적 인 이유

아무에게도 static.it이 nonstatic 일 수있는 이유를 말해 줄 수 있습니까?

답변

5

객체 변수의/회원에 액세스 할 수 있기 때문에 일단 Object가 성공적으로 생성됩니다. Object 변수를 작성하지 않고 액세스 할 수 없습니다. 이제 질문에 다시, deserialization하는 동안 데이터에서 개체를 만들어야합니다. 개체가 deserializable 여부를 확인할 수있는 방법이 없으면 Object 멤버를 가져올 방법이 없습니다.

같은 이유로 UID는 정적으로 만들어집니다.

0

serialVersionUID는 사용자가 serializer와 deserializer에서 동일한 이진 버전을 갖고 있으며 오래된 버전에서는 아무 문제가 없다는 것을 확인하는 규칙입니다. 또한, 직렬화 뷰어에서 다른 종류의 클래스에 대해 동일한 이름을 가진 경우 일 수 있으므로 serialVersionUID는 고유 한 식별자로 정렬됩니다. 직렬화 된 데이터와 함께 "는 정적이어야합니다 (그래서"아니 모든 인스턴스, 클래스에 경계하고있다) "보낸 이유

.

그것은 그것이 명령에 따른 것입니다 때문에 정적이어야
0

JRE는 그렇게해야하는 추론이 간단 할 수 있습니다, 그것은 실제로 클래스의 객체를 생성하지 않고, 정적 방법으로 액세스 할 수 있습니다

javadocs에서 :.. 각 직렬화와

직렬화 런타임 동료 class a 버전 num 직렬화 된 직렬화의 송신자와 수신자가 직렬화와 관련하여 과 호환되는 해당 객체의 클래스를로드했는지 확인하기 위해 직렬화 버전 ID를 호출합니다. 수신자가 해당 송신자의 클래스 과 다른 serialVersionUID를 가진 개체의 클래스를로드 한 경우 deserialization은 InvalidClassException이됩니다. 직렬화 클래스는 최종라는 이름의 필드 "의 serialVersionUID"정적이어야 선언하여 자신의 의 serialVersionUID를 명시 적으로 선언 할 수 있습니다, 긴 타입 :

+0

이유는 무엇입니까? 나는 OP가 왜 JRE가 정적 이도록 요구 하는지를 알고 싶어한다. – sanbhat

0

예외는 직렬화됩니다. 그것은 static 클래스의 모든 인스턴스가 아니라 클래스에 바인딩되어 있기 때문에 나는 그것을 믿습니다. 모든 클래스 인스턴스는 동일한 serialVersionUID을 준수해야합니다. 다시 정적 인 것은 객체를 생성하지 않고 실행 시간이 실제로 그 ID를 획득 할 수 있다는 것을 의미하는 반면 객체를 역 직렬화 할 필요는 ID를 확인하는 것입니다. 개체가 serialize되면 클래스 이름, 개체 상태 (비 정적 멤버 변수) 및 serialVersionUID이 유지됩니다.

0

직렬화 런타임은 각 직렬화 가능 클래스에 serialVersionUID라는 버전 번호를 연결합니다. 직렬화 된 개체의 보낸 사람과받는 사람이 직렬화와 관련하여 해당 개체의 클래스를로드했음을 확인하기 위해 직렬화 해제 중에 사용되는 버전 번호입니다.수신자가 해당 송신자의 클래스와 다른 serialVersionUID를 가진 객체의 클래스를로드 한 경우 deserialization으로 인해 InvalidClassException이 발생합니다. 직렬화 가능 클래스는, 정적 최종해야합니다 "의 serialVersionUID"라는 이름의 필드를 선언함으로써 자신의 serialVersionUID를 명시 적으로 선언 할 수 있습니다, 긴 타입 :

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

그 정적으로 선언의 클래스와되지 않은 함수와 관련된/변수.

1

먼저 serialVersionUID이 무엇인지 이해해야합니다. java.io.Serializable 가입일

각 직렬화 클래스

직렬화 런타임을 연관 버전 번호 직렬화 객체의 송신기 및 수신기가로드되었는지 확인하기 직렬화 중에 사용되는 serialVersionUID의라고 불리는 그 객체의 클래스는, 직렬화에 관해서는 와 호환됩니다. 수신자가 해당 송신자의 클래스 과 다른 serialVersionUID를 가진 개체의 클래스를로드 한 경우 deserialization은 InvalidClassException이됩니다.

serialVersionUID클래스 다른 버전 간의 호환성을 결정한다. 속성은 클래스에 바인딩되므로 static을 만들어야합니다.

0

serialVersionUID는 클래스 인스턴스가 아니라 클래스 자체에 적용되므로 정적입니다. ObjectOutputStream 클래스 기술자에 포함됩니다.

관련 문제