2011-08-02 5 views
3

약 2004 년 이후 프로덕션에서 사용중인 Serializable 클래스가 있습니다. 그러나 작성한 사람은 serialVersionUID을 생성하는 것을 잊었습니다.serialVersionUID를 이미 사용중인 직렬화 가능 클래스에 추가합니다.

모든 종류의 작품 (수업에서 아무 것도 만지지 말라는 큰 경고가 있음)이 있지만 관련 다른 수업에서 나는 InvalidCastException을 가졌으므로 serialVersionUID을 추가하고 싶습니다. 수업이 제대로 작동하는지 확인하십시오.

질문은 기존의 직렬화 된 인스턴스가 깨지지 않고 그러한 필드를 추가 할 수 있습니까? 많은 것들이 있으며 쉽게 수정할 수있는 방법이 없습니다. , 나는 시리얼로 (추적에서 스트림 classdesc) 암시 시리얼을 사용할 수 있다고 생각했습니다

java.io.InvalidClassException: the.problematic.Class; local class incompatible: stream classdesc serialVersionUID = -8802277085918151566, local class serialVersionUID = -3137213695071887162" 

:

내 생각의 라인을 따라 뭔가 예외 메시지를보고 온 하위 호환성을 유지해야합니다. 이 올바른지? 우리가 시스템 전체에 걸쳐 가지고있는 직렬화 된 인스턴스가 모두 동일한 버전이라는 점은 다소간 확실합니다.

답변

5

예, 계산 된 값과 동일한 값을 serialVersionUID으로 지정하면 이전 버전과의 호환성을 방지해야합니다 (예 : Eclipse에는이를 수행 할 수있는 옵션 인 "생성 된 일련 ID ID 추가").

+0

이 ID가 계산되는 방식이 정의되어 있으며 jdk 버전간에 변경되지 않았는지 확인했습니다. –

1

직렬화 된 스트림에서 읽은 serialVersionUID를 확인하는 경우주의해야합니다 (간단히 : 객체를 변경하고 읽을 때 예외가 예상 값을 알려줍니다). 코드에 넣을 수 있습니다 이 특정 환경에서 작동합니다. 그러나 antother 플랫폼의 다른 JDK (예 : IBM 대 SUN)에는 서로 다른 serialVersionUID가 호환되지 않을 수 있습니다. (최악의 경우, 지원되는 VM의 알려진 값 목록에서 serialversionuid를 계산해야합니다.)

관련 문제