Java - изменение serialVersionUID двоичного сериализованного объекта - PullRequest
1 голос
/ 15 января 2009

Несколько месяцев назад я сериализовал объект java.io.Serializable в файл. Теперь мне нужно прочитать содержимое, но с тех пор serialVersionUID изменился, и теперь я получаю ошибку «несовместимость классов». Я точно знаю, что ни один из элементов данных не изменился, поэтому единственным препятствием является проверка serialVersionUID.

Есть ли способ отключить проверку или изменить serialVersionUID в двоичном файле?

ПОЯСНЕНИЯ

Этот вопрос предполагает, что я не могу редактировать источник. Есть ли способ, которым я могу взломать файл .class или, возможно, взломать сериализованный объектный файл (использовать шестнадцатеричный редактор и изменить значение с определенным смещением)?

Ответы [ 4 ]

2 голосов
/ 16 апреля 2009

Недавно я попал в похожую ситуацию - у меня было несколько сериализованных объектов, которые мне нужно было прочитать, serialVersionUID этих объектов отличалось от последней версии, и, в моем случае, было несколько разных serialVersionUID s хранятся в файле для одного и того же класса (очевидно, в разное время). Таким образом, у меня не было роскоши изменять класс и устанавливать его serialVersionUID; Я действительно должен был войти и изменить сохраненные данные.

Что я понял (прочитав исходный код java.io), так это то, что объект сериализуется сначала сохранением имени класса (используя writeUTF()), а затем сразу после использования writeLong() для сохранения serialVersionUID.

Мое решение состояло в том, чтобы перехватить исключение, затем вернуться назад, найти имя класса и сразу после имени класса заменить старый serialVersionUID новым.

2 голосов
/ 15 января 2009

Почему бы не изменить serialVersionUID в текущей версии вместо этого, как описано в документации Сериализация ?

2 голосов
/ 15 января 2009

В качестве хака вы можете сгенерировать serialVer, который, вероятно, использует ваш jvm, используя инструмент serialver:

serialver -classpath независимо от com.foo.bar.MyClass

Если вы затем вручную задаете serialVerUID в своем классе, он должен совпадать, и вы должны иметь возможность загружать, предполагая, что вы не изменили класс таким образом, чтобы сделать недействительным.

0 голосов
/ 15 января 2009

Документально подтверждено, что сериализация не предназначена для использования для сохранения данных. Чтобы вернуть эти данные, вам необходимо понизить версию JVM до версии, которая использовалась для вывода этих данных.

Для дальнейшего использования не используйте сериализацию для сохранения данных между сеансами JVM.

...