문제

몇 달 전에 나는 java.io.serializable 객체를 파일에 직렬화했습니다. 이제 내용을 읽어야하지만 그 이후로 SerialversionUid가 변경되었으며 이제 "클래스 호환"오류가 발생합니다. 나는 데이터 구성원이 변경되지 않았다는 사실을 알고 있으므로 장벽은 SerialversionUid 검사입니다.

검사를 비활성화하거나 이진 파일에서 SerialversionUid를 수정하는 방법이 있습니까?

설명

이 질문은 소스를 편집 할 수 없다고 가정합니다. .class 파일을 해킹하거나 직렬화 된 객체 파일을 해킹 할 수있는 방법이 있습니까 (Hex 편집기를 사용하고 특정 오프셋에서 값을 변경)?

도움이 되었습니까?

해결책

해킹으로 JVM이 Serialver 도구를 사용하여 사용중인 시리얼을 생성 할 수 있습니다.

serialver -classpath hote com.foo.bar.myclass

그런 다음 수업에서 SerialVeruid를 수동으로 설정하면 일치해야하며 무효화와 같은 수업을 변경하지 않았다고 가정하면로드 할 수 있어야합니다.

다른 팁

현재 버전에서 SerialVersionUid를 수정하지 않겠습니까? 직렬화 선적 서류 비치?

나는 최근에 비슷한 상황에서 나 자신을 발견했다-나는 내가 읽어야 할 일련의 물체를 가지고있다. serialVersionUID 그 객체 중 최신 버전과는 달랐으며, 제 경우에는 몇 가지가있었습니다. serialVersionUIDS는 동일한 클래스에 대해 파일에 저장된 (분명히 다른 시간에 저장). 그래서 나는 수업을 수정하고 그것을 설정하는 사치가 없었습니다. serialVersionUID; 실제로 저장된 데이터를 수정해야했습니다.

내가 알아 낸 것은 (java.io 소스 코드를 읽음으로써) 먼저 클래스 이름을 저장하여 객체가 직렬화된다는 것입니다 (사용 writeUTF()) 그리고 사용 직후 writeLong() 저장하려면 serialVersionUID.

내 해결책은 예외를 포착 한 다음 돌아가서 클래스 이름을 찾는 것이었고 클래스 이름 직후에 기존을 교체하는 것이 었습니다. serialVersionUID 새로운.

직렬화는 지속되는 데이터에 사용되지 않는 것으로 문서화되어 있습니다. 해당 데이터를 되 찾으려면 JVM 버전을 해당 데이터를 출력하는 데 사용 된 버전으로 다운 그레이드해야합니다.

향후 참조를 위해 직렬화를 사용하여 JVM 세션간에 데이터를 지속하지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top