2012-05-18 3 views
1

클라이언트 - 서버 설정에서 서버가 보낸 객체의 클래스 정의를 수정하여 클라이언트 측에서 충돌이 예상됩니다 (클라이언트 Jar가 이러한 변경 사항을 반영하도록 업데이트되지 않았습니다).호환되지 않는 객체 버전간에 Java de/serialization이 성공하는 이유는 무엇입니까?

그러나 충돌하지 않습니다.

참고 : 클라이언트에서 개체를 사용하는 방식은 충돌을 피할 수 있습니다. 클라이언트는 deserialize 된 Object를 절대 캐스팅하지 않으며 제거 된 필드를 사용하지 않습니다. 객체는 파이썬 스크립트에서 Jython을 통해서만 사용됩니다. 객체의 필드를 사용할 때 후기 바인딩 메커니즘 (reflection?)을 사용하기 때문에 가능합니다. 이것은 또한 직렬화에 클래스의 서명 (true)이 포함되어 있다고 가정합니다 (ObjectOutputStream의 문서에서 언급 됨).

메모 : serialVersionUid는 절대로 변경하지 않습니다.

내 추론이 맞는 것처럼 보입니까?

답변

1

글쎄 serialVersionUID을 수업에 사용하는 경우 변경해야합니다.

그렇지 않으면 변경 사항이있을 경우 java가 리플렉션을 통해 예외를 throw합니다.

+0

제 경우에는 여분의 필드 (제공하지 않는 스트림에서)가있는 클래스로 deserialize하고 있습니다. 내 serialVersionUID가 동일합니다. 명세에 따르면 이것은 예외적 인 변경이되어야하지만 예외는 발생하지 않습니다. – haelix

3

serialization은 serialVersionUID를 제공하지 않았을 때만 버전 서명을 사용하여 버전을 생성합니다. 클래스 버전을 제공하기 때문에 클래스 서명을 사용하지 않을 것입니다. 그것은 모두 호환 가정 및 필드 삭제 기본 동작

+0

그래, 항상 = 1로 유지되는 SerialVersionUID를 사용하고 있습니다. 클래스 서명이 "사용되지 않음"이라고 말하고 있습니다. 그렇다면 클래스에서 알 수없는 객체 인 스트림에서 Java를 가져올 수 있습니까? – haelix

0

을 수행 변경하지 이후

은 오랫동안 serialVersionUIDs 일치로, 호환되지 않는 변경되지 않습니다. 객체 직렬화 스펙의 객체 버젼 관리의 장을 참조 해주세요.