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

Lux*_*ode 6 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
Run Code Online (Sandbox Code Playgroud)

Sim*_*nni 7

你在读文件吗?在这种情况下,如果您现在添加serialVersionUID并不重要,它与文件中存储的不同,并且会创建异常.

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


Jac*_*ack 6

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

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

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

这些可能是问题,肯定是其中之一,所以我认为你不应该期待一些奇怪的事情.根据我的个人经验,我还可以添加使用不同的JVM版本来序列化和反序列化可能会产生这个问题,所以也要确保它.