2013-10-14 3 views
1

Я хочу сериализовать и десериализовать объект, содержащий массив цветов. (цвет [] [])Deserialize java.awt.Color -> java.io.InvalidClassException

Массив цвета представляет собой небольшую иконку.

После некоторого Строит я получаю сообщение об ошибке при попытке десериализации объекта:

java.io.InvalidClassException: java.awt.Color; local class incompatible: stream classdesc serialVersionUID = 118526816875918197, local class serialVersionUID = 118526816881161077 

Что я могу сделать, чтобы исправить это? Сам объект имеет UID по умолчанию (serialVersionUID = 1L;) ...

Спасибо :)

+1

Вы работаете с сервером как jboss? возможно, у вас есть конфликт с банками, банкой, которую вы используете в локальном и приоткрытом состоянии на сервере. Это разные ... надеюсь, это поможет. – ZaoTaoBao

+0

Heyho :) Нет, все локально ... Он работал несколько недель назад без проблем ... Не знаю, почему его сбой теперь:/Могу ли я установить/увидеть UID класса цветов? –

+0

Ты работаешь с maven? – ZaoTaoBao

ответ

2

Посмотрите на сообщение об ошибке снова:

java.io.InvalidClassException: java.awt.Color; 
local class incompatible: 
stream classdesc serialVersionUID = 118526816875918197, 
local class serialVersionUID = 118526816881161077 

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

Это serialVersionUID в моей среде.

private static final long serialVersionUID = 118526816881161077L; 

Это совпадает с вашим вторым serialVersionUID. Однако первый отличается: 118526816875918197. Этот факт немного странный, потому что я сравнивал ID этой версии с java 6 и java 7 JDK, и они равны. Я не могу сравнивать его со старым JDK, а также с JDK от других поставщиков (а не от Oracle). Поэтому я могу предположить, что вы создали свой файл с более старой версией JDK или с JDK от другого поставщика (например, откройте JDK, IBM и т. Д.) Или на другой платформе.

Если это так, я предлагаю вам настроить сериализацию своего класса, реализовав собственные методы writeObject() и readObject(). Вам не нужно повторно внедрять сериализацию всех ваших классов. Достаточно обернуть Color вашей настраиваемой оболочкой, чтобы настроить сериализацию.

ВЗАИМОДЕЙСТВИЕ ПЕРЕХОДНОЙ/обратной совместимости сериализованного объекта является известной слабостью всего механизма сериализации java. Вы можете использовать альтернативы, например. сериализация в JSON, XML или другой двоичный формат.

Для JSON вы можете использовать Jackson или Gson для XML JAXB или Xstream для бинарного формата protobuff.

+0

Спасибо :) Проблема: я сериализую и десериализую файл с моей текущей сборкой: O Я не знаю, как UID может измениться? Как я могу обернуть цвет? –

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