Добавьте serialVersionUID в сериализуемый класс, который уже используется - PullRequest
3 голосов
/ 02 августа 2011

У меня есть класс Serializable, который используется в производстве примерно с 2004 года. Однако парень, который написал его, забыл сгенерировать serialVersionUID.

Все это работает (есть большое замечание, предупреждающее, что в классе ничего не трогать), но при работе в другом связанном классе у меня было InvalidCastException, поэтому я хочу добавить serialVersionUID чтобы убедиться, что класс работает правильно.

Вопрос в том, возможно ли добавить такое поле, не нарушая существующие сериализованные экземпляры? Их много, и нет простого способа их изменить.

Моя идея пришла от просмотра сообщения об исключении, которое выглядит примерно так:

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

Я подумал, что мог бы использовать неявный последовательный (потоковый classdesc в трассировке) в качестве последовательного, и он должен сохранять обратную совместимость. Это правильно? Я (более или менее) уверен, что все сериализованные экземпляры, которые мы получили в системе, имеют одинаковую версию.

Ответы [ 2 ]

5 голосов
/ 02 августа 2011

Да, указание того же значения для serialVersionUID, что и для вычисленного значения, должно препятствовать обратной совместимости (например, в Eclipse есть опция, которая называется «Добавить сгенерированный серийный идентификатор версии»).

1 голос
/ 22 июня 2012

Вы должны быть осторожны, если вы проверяете serialVersionUID, который вы читаете из сериализованного потока (просто: просто измените объект и прочитайте его, исключение сообщит вам ожидаемое значение), вы можете вставить это в свой код ион будет работать с этой конкретной средой.Однако другой JDK (например, IBM против SUN) на другой платформе может иметь несовместимые разные serialVersionUID.(в худшем случае вам нужно вычислить serialversionuid из списка известных значений для поддерживаемых виртуальных машин).

...