Проблема десериализации гибернации - PullRequest
3 голосов
/ 05 марта 2012

Я пытаюсь обновить код гибернации, который был написан кем-то другим в прошлом и сталкивается с проблемой десериализации. Как был написан оригинальный код, он не имел явно объявленного serialVersionUID и только что реализовал интерфейс Serializable -

public class SamplePOJO implements Serializable {

Теперь я пытаюсь добавить новый столбец в таблицу и сопоставить его с этим объектом. I:

  1. Изменена таблица для создания нового столбца
  2. Обновлен объект, чтобы включить новый объект String и метод получения / установки за это и
  3. Обновлен файл .hbm для сопоставления столбца таблицы БД с объектом.

Однако, когда я запускаю его после компиляции, я получаю следующую ошибку -

"Error while deserializing from byte[]., caused by x.y.SamplePOJO; local class incompatible: stream classdesc serialVersionUID = 7997933458932550222, local class serialVersionUID = <other number internally auto generated as  source didn't explicitly mention serialVersionUID>"

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

Исходя из того, какую информацию я обнаружил, наиболее распространенной причиной, по-видимому, являются различные спящие банки в клиенте и сервере. Тем не менее, это не тот случай, когда он использует тот же банку гибернации. Может ли кто-нибудь помочь, если есть способ решить эту проблему, не упоминая отдельно serialVersionUID, который выдается во время исключения? Кроме того, если мне придется придерживаться этого подхода и если мой код переместится в другую среду (qa / prod), будет ли ожидаться другой serialVersionUID в зависимости от того, как он сериализуется в других средах?

Буду признателен за любую помощь!

1 Ответ

1 голос
/ 01 апреля 2012

Чтобы ответить на ваш второй вопрос первым, генерация serialVersionUID во время выполнения JVM определяется Спецификацией сериализации объектов Java. Хотя генерация serialVersionUID во время выполнения является предсказуемой, она может варьироваться в зависимости от java-компиляторов, поскольку зависит от состава файла класса, который зависит от конкретной реализации компилятора. Таким образом, ваш скомпилированный код не должен генерировать разные serialVersionUID во время выполнения в разных средах. Команду serialver из JDK можно использовать для вычисления времени выполнения сгенерированного serialVersionUID для класса.

Вы говорите о том, что на клиенте и сервере есть спящий jar, похоже, что вы сериализуете свои сущности между двумя разными JVM, вы уверены, что у клиента есть обновленный класс сущностей? Ошибка указывает, что вы пытаетесь десериализовать байт [], сгенерированный из сериализации другой версии файла класса. Вам нужно либо убедиться, что вы десериализованы в ту же версию класса, либо добавить к нему serialVersionUID.

...