序列化/反序列化期间的java.io.invalidClassException

时间:2011-08-03 00:25:50

标签: java android

我有一个对象,即fileinputstreams/objectinputstreamsobjectinputstreams/objectoutputstreams来回读写。我不断收到java感谢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 个答案:

答案 0 :(得分:7)

你在读文件吗?在这种情况下,现在添加serialVersionUID并不重要,它与文件中存储的不同,并且会产生异常。

快速解决方案可能是将serialVersionUID设置为4209360273818925922L,这似乎是当时在该文件中保存这些对象时由java自动生成的serialVersionUID:)

答案 1 :(得分:6)

如文档中所述,这可能由于三个不同原因而发生:

  • 该类的串行版本与从流
  • 读取的类描述符的版本不匹配
  • 该类包含未知数据类型
  • 该类没有可访问的no-arg构造函数

因此,首先检查两个实现是否具有相同的serialVersionUID。如果这是真的,您必须确保该类不使用任何未定义(或未知)的类型到您尝试反序列化的JVM。最后,您需要提供一个标准构造函数ClassName(),它会执行空的初始化。

这些可能是问题,而且肯定是其中之一,所以我认为你不应该期待一些奇怪的东西。根据我的个人经验,我还可以补充说,使用不同的JVM版本来序列化和反序列化会产生这个问题,所以一定要确定它。

答案 2 :(得分:3)

你看到第一行?
你有不同的serialVersionUID,但是它们彼此不兼容,你必须使用相同的serialVersionUID!

java.io.InvalidClassException:

com.luxurymode.pojos.Reminder;不兼容的类(SUID):com.luxurymode.pojos.Reminder:static final long serialVersionUID = 4209360273818925922L ; 但预期 com.luxurymode.pojos.Reminder:static final long serialVersionUID = 1L ;