我有一个对象,即fileinputstreams/objectinputstreams
和objectinputstreams/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
答案 0 :(得分:7)
你在读文件吗?在这种情况下,现在添加serialVersionUID并不重要,它与文件中存储的不同,并且会产生异常。
快速解决方案可能是将serialVersionUID设置为4209360273818925922L,这似乎是当时在该文件中保存这些对象时由java自动生成的serialVersionUID:)
答案 1 :(得分:6)
如文档中所述,这可能由于三个不同原因而发生:
因此,首先检查两个实现是否具有相同的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 ;