java.io.invalidClassException во время сериализации / десериализации - PullRequest
6 голосов
/ 03 августа 2011

У меня есть объект, который я читаю и пишу в fileinputstreams/objectinputstreams и objectinputstreams/objectoutputstreams.Я продолжаю получать сообщения об ошибках, которые якобы ожидал один serialversionUID, но нашел другой.

В моем классе я реализовал serializable и у меня есть поле наподобие static final long serialVersionUID = 1L;, которое, на мой взгляд, было достаточно.

Я новичок в сериализации Java.Что мне здесь не хватает?

РЕДАКТИРОВАТЬ Если это имеет значение, я на самом деле пытаюсь написать и прочитать **ArrayList<MyObject>**

Вот полный след:

java.io.InvalidClassException: com.luxurymode.pojos.Reminder; Incompatible class (SUID): com.luxurymode.pojos.Reminder: static final long serialVersionUID =4209360273818925922L; but expected com.luxurymode.pojos.Reminder: static final long serialVersionUID =1L;
W/System.err( 4504):    at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2723)
W/System.err( 4504):    at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1848)
W/System.err( 4504):    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:826)
W/System.err( 4504):    at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2066)
W/System.err( 4504):    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
W/System.err( 4504):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
W/System.err( 4504):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
W/System.err( 4504):    at java.util.ArrayList.readObject(ArrayList.java:662)
W/System.err( 4504):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 4504):    at java.lang.reflect.Method.invoke(Method.java:521)
W/System.err( 4504):    at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1537)
W/System.err( 4504):    at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1460)
W/System.err( 4504):    at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2139)
W/System.err( 4504):    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
W/System.err( 4504):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
W/System.err( 4504):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
W/System.err( 4504):    at com.luxurymode.singletons.RemindersSingleton.<init>(RemindersSingleton.java:54)
W/System.err( 4504):    at com.luxurymode.singletons.RemindersSingleton.getInstance(RemindersSingleton.java:66)
W/System.err( 4504):    at com.luxurymode.views.AddReminderView.saveAlarm(AddReminderView.java:290)
W/System.err( 4504):    at com.luxurymode.tab_2.RemindersActivity.onClick(RemindersActivity.java:94)
W/System.err( 4504):    at android.view.View.performClick(View.java:2554)
W/System.err( 4504):    at android.view.View$PerformClick.run(View.java:8962)
W/System.err( 4504):    at android.os.Handler.handleCallback(Handler.java:587)
W/System.err( 4504):    at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err( 4504):    at android.os.Looper.loop(Looper.java:123)
W/System.err( 4504):    at android.app.ActivityThread.main(ActivityThread.java:4627)
W/System.err( 4504):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 4504):    at java.lang.reflect.Method.invoke(Method.java:521)
W/System.err( 4504):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
W/System.err( 4504):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
W/System.err( 4504):    at dalvik.system.NativeStart.main(Native Method)
D/AndroidRuntime( 4504): Shutting down VM

Ответы [ 3 ]

7 голосов
/ 03 августа 2011

Вы читаете из файла?В этом случае не имеет значения, если вы добавили serialVersionUID сейчас, он отличается от того, который хранится в файле, и это создает исключение.

Быстрое решение может состоять в том, чтобы установить serialVersionUID равным 4209360273818925922L, чтокажется serialVersionUID, который был автоматически сгенерирован Java, когда вы сохранили эти объекты в этом файле в то время:)

6 голосов
/ 03 августа 2011

Как указано в документации, это может произойти по трем причинам:

  • Последовательная версия класса не соответствует версии дескриптора класса, считанного из потока
  • Класс содержит неизвестные типы данных
  • В классе нет доступного конструктора без аргументов

Итак, прежде всего убедитесь, что обе реализации имеют одинаковые serialVersionUID. Если это так, вы должны быть уверены, что класс не использует какой-либо неопределенный (или неизвестный) тип для JVM, в которую вы пытаетесь десериализоваться. Наконец, вам нужно предоставить стандартный конструктор ClassName(), который выполняет пустую инициализацию.

Это могут быть проблемы, и, конечно, это одна из них, так что я не думаю, что вам стоит ожидать чего-то странного. Из своего личного опыта могу также добавить, что использование разных версий JVM для сериализации и десериализации может создать эту проблему, поэтому убедитесь в этом тоже.

3 голосов
/ 03 августа 2011

Вы видите первую строку?
У вас есть разные serialVersionUID, они несовместимы друг с другом, вы должны использовать тот же serialVersionUID!

java.io.InvalidClassException:

com.luxurymode.pojos.Reminder;Несовместимый класс (SUID): com.luxurymode.pojos.Reminder: static final long serialVersionUID = 4209360273818925922L ; но ожидается com.luxurymode.pojos.Reminder: статическое окончание long serialVersionUID = 1L ;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...