Проблема десериализации только в затмении - PullRequest
1 голос
/ 14 октября 2011

Обычно я создаю jar и развертываю jar с помощью ant, однако мне нужно отладить проблему, поэтому я бросил код в eclipse и попытался запустить класс main (со всеми теми же параметрами, которые я обычно пытаюсь запустить баночка с).

Тем не менее, я получил эту проблему, и некоторое время я бился головой о стену. Я попытался добавить private static final serialVersionUID к 466 ..., я также попытался установить его на 1 л и добавить аннотацию, чтобы игнорировать предупреждение.

Однако он продолжает выбрасывать InvalidClassException.

Есть ли способ заставить Eclipse вести себя больше как выполнение java -jar myjar.jar, которое строит муравей. Также есть ли причина, почему это происходит именно здесь? (Это также та же JVM, с которой я использую банку).

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
    java.io.InvalidClassException: com.blah.MyClass local class incompatible: stream classdesc serialVersionUID = 46644259037142, local class serialVersionUID = -175274031382959

Спасибо!

Ответы [ 3 ]

1 голос
/ 14 октября 2011

Даже небольшое изменение сериализуемого класса изменит SUID , если вы явно не укажете ту же версию.Если этот класс используется для десериализации персистентного объекта, созданного в более старой версии, вы получите сообщение об ошибке.

Непонятно, как вы пытаетесь сериализовать / десериализовать объект, но я предполагаю, что это проблема версии класса клиент-сервер RMI.Развернут ли класс для клиента и сервера?

1 голос
/ 14 октября 2011

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

Это одна из причин, почему некоторым людям не нравится сериализация Java;)

0 голосов
/ 14 октября 2011

Компилятор eclipse не генерирует те же serialVersionUID, что и javac, см. здесь . Если вы хотите совместимости между javac и компилятором eclipse, определите

    public static final long serialVersionUID = ...;

во всех ваших сериализуемых классах, они будут работать.

...