Java- 이진 직렬화 된 객체의 직렬 버전 수정
-
22-07-2019 - |
문제
몇 달 전에 나는 java.io.serializable 객체를 파일에 직렬화했습니다. 이제 내용을 읽어야하지만 그 이후로 SerialversionUid가 변경되었으며 이제 "클래스 호환"오류가 발생합니다. 나는 데이터 구성원이 변경되지 않았다는 사실을 알고 있으므로 장벽은 SerialversionUid 검사입니다.
검사를 비활성화하거나 이진 파일에서 SerialversionUid를 수정하는 방법이 있습니까?
설명
이 질문은 소스를 편집 할 수 없다고 가정합니다. .class 파일을 해킹하거나 직렬화 된 객체 파일을 해킹 할 수있는 방법이 있습니까 (Hex 편집기를 사용하고 특정 오프셋에서 값을 변경)?
해결책
해킹으로 JVM이 Serialver 도구를 사용하여 사용중인 시리얼을 생성 할 수 있습니다.
serialver -classpath hote com.foo.bar.myclass
그런 다음 수업에서 SerialVeruid를 수동으로 설정하면 일치해야하며 무효화와 같은 수업을 변경하지 않았다고 가정하면로드 할 수 있어야합니다.
다른 팁
현재 버전에서 SerialVersionUid를 수정하지 않겠습니까? 직렬화 선적 서류 비치?
나는 최근에 비슷한 상황에서 나 자신을 발견했다-나는 내가 읽어야 할 일련의 물체를 가지고있다. serialVersionUID
그 객체 중 최신 버전과는 달랐으며, 제 경우에는 몇 가지가있었습니다. serialVersionUID
S는 동일한 클래스에 대해 파일에 저장된 (분명히 다른 시간에 저장). 그래서 나는 수업을 수정하고 그것을 설정하는 사치가 없었습니다. serialVersionUID
; 실제로 저장된 데이터를 수정해야했습니다.
내가 알아 낸 것은 (java.io 소스 코드를 읽음으로써) 먼저 클래스 이름을 저장하여 객체가 직렬화된다는 것입니다 (사용 writeUTF()
) 그리고 사용 직후 writeLong()
저장하려면 serialVersionUID
.
내 해결책은 예외를 포착 한 다음 돌아가서 클래스 이름을 찾는 것이었고 클래스 이름 직후에 기존을 교체하는 것이 었습니다. serialVersionUID
새로운.
직렬화는 지속되는 데이터에 사용되지 않는 것으로 문서화되어 있습니다. 해당 데이터를 되 찾으려면 JVM 버전을 해당 데이터를 출력하는 데 사용 된 버전으로 다운 그레이드해야합니다.
향후 참조를 위해 직렬화를 사용하여 JVM 세션간에 데이터를 지속하지 마십시오.