2013-09-04 4 views
2

Я использую класс, который реализует Serializable из jar, и чтобы убедиться, что не будет проблем, связанных с компилятором, я дал ему serialVersionUID private static final long serialVersionUID = 123L;Где я могу установить класс classdesc serialVersionUID?

Затем я воссоздал банку, но теперь, когда я использую класс внутри новой баночке дает мне исключение:

java.io.InvalidClassException: com.placeiq.piqhash.PIQDeviceId; локальный класс несовместим: stream classdesc serialVersionUID = 1568630193381428614, local class serialVersionUID = 123

Так что мой вопрос: 1, Что такое класс streamdesc serialVersionUID? 2, что я могу сделать, чтобы установить его так, чтобы два serialVersionUID были одинаковыми?

Спасибо!

+1

Создание файла jar не печатает такого сообщения. Какой код вы используете при получении ошибки? Если вы измените версию и затем прочитаете старые данные с классом, она не удастся. – bmargulies

+0

Привет, @bmargulies, который не показывался во время создания jar-процесса, он был брошен, когда я пытался написать ему в моем другом проекте. – Liang

ответ

3

Серийная версия этого класса происходит откуда-то (в потоке) и имеет идентификатор серийной версии 1568 ... но его нельзя десериализовать для вашей версии класса (локального класса), которая равна 123 .

Вам нужно выяснить, откуда эта другая версия. Затем вам нужно использовать новую банку с новой версией класса, где бы вы ни были (если можете).

Некоторые возможные источники:

  • сеть сообщение с другого компьютера приходит в вашу программу с сериализованном экземпляр этого класса. (Это могут быть сырые сообщения сокета или RMI или все, что использует сериализацию Java. Это не будет сообщение JSON или XML-сообщение, которое будет сопоставлено с этим объектом.)

  • Другая программа или старая версия вашей программы написал экземпляр класса в файл на диске (или иным образом с файловой системой), и ваша программа не извлекает его.

  • Ваша программа имеет две версии фляги - старую и новую - которые присутствуют, как правило, из-за разных загрузчиков классов. (Это может произойти, если вы не будете осторожны, чтобы управлять всеми имеющиеся на пути к классам в Java EE контейнер некоторого вида, включая Tomcat или Jetty.)

Это не исчерпывающий список.

0

Вы должны установить serialVersionUID в своем классе, чтобы он соответствовал классу десериализации класса. В этом случае он должен быть 1568630193381428614, а не 123L.

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

+0

Спасибо за ответ! Так что в принципе. в новом проекте я создаю много объектов этого класса из банки. Могу ли я спросить, где определен «stream classdesc serialVersionUID»? – Liang

+0

Он находится в определении класса в 'com/placeiq/piqhash/PIQDeviceId.java', а не в части свойства объекта. Вам не нужно будет создавать этот файл, скорее, вы должны ссылаться на тот, который уже создан из jar в пути к классам. – PaulProgrammer

Смежные вопросы