Что происходит, когда вы десериализуете несовместимую версию - PullRequest
2 голосов
/ 02 июня 2011

Что происходит, когда я использую ObjectInputStream для чтения в сериализованном объекте, который несовместим с тем, который в настоящее время определен в программе? Получу ли я исключение или просто полностью искаженные данные?

Имеет ли какое-либо значение, если я обновил serialVersionUID (при необходимости) при компиляции более новой версии?

Я огляделся и не могу понять, что происходит - только то, что вы должны обновить serialVersionUID.

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Этот ответ подводит итог:

Представьте, что у вас есть класс с именем Foo, и у него НЕТ serialversionuid (по умолчанию), и вы сериализовали экземпляр Foo дляфайл.Позже вы добавите несколько новых членов в класс Foo.Если вы попытаетесь десериализовать объект Foo из файла, вы получите ошибку сериализации, сообщающую, что объекты несовместимы.Они несовместимы, это то, что вы хотите, и по умолчанию.Они несовместимы, потому что новые члены в классе Foo не могут быть инициализированы из старого сериализованного экземпляра Foo.

Теперь вы можете сказать: «Мне все равно, в моем приложении допустимо, чтобы эти полябыть неинициализированным ".Если это действительно так, вы можете установить serialversionuid класса NEW Foo таким же, как класс OLD Foo.Это скажет Java, что объекты совместимы в отношении сериализуемости, и Java не будет жаловаться, когда вы десериализуете старый экземпляр Foo в новый класс Foo (но новые поля все равно будут неинициализированы).

Если высоздаете новый класс в первый раз, и вы устанавливаете serialversionuid, ВЫ ВХОДИТЕ В КОНТРАКТ.Вы говорите: «Для всех будущих версий этого класса с одним и тем же serialversionuid я гарантирую, что они совместимы в отношении состояния и сериализации».

Если вы измените класс, и вы явно хотите отключить десериализациюстарых версий вы можете изменить serialversionuid на новое значение.Это вызовет исключение, если попытаться десериализовать старый объект в новый экземпляр класса.

0 голосов
/ 06 июня 2011

Если неявные или явные serialVersionUID не совпадают, вы получаете исключение, подобное этому:

java.io.InvalidClassException: SerialVersionUID; local class incompatible: stream classdesc serialVersionUID = 2, local class serialVersionUID = 3
...