Java可序列化失败

Java可序列化失败,java,android,serializable,Java,Android,Serializable,我有一个名为Expression的类,我正试图使用以下load()/save()函数序列化该类。在对我的代码和Expression类进行一些更改后,调用.readObject()中的in抛出ClassCastException,它过去工作得很好。 错误消息是: java.lang.ClassCastException:java.lang.String不能转换为java.io.ObjectStreamClass对我来说,将二进制数据存储为字符串感觉非常糟糕。尝试使用更稳定的方式存储ObjectOu

我有一个名为Expression的类,我正试图使用以下load()/save()函数序列化该类。在对我的代码和Expression类进行一些更改后,调用.readObject()中的
in
抛出
ClassCastException
,它过去工作得很好。 错误消息是:
java.lang.ClassCastException:java.lang.String不能转换为java.io.ObjectStreamClass对我来说,将二进制数据存储为字符串感觉非常糟糕。尝试使用更稳定的方式存储ObjectOutputStream的二进制输出。如果您真的想坚持使用字符串格式的方法,请尝试使用Base64编码,这总是安全的


我可能认为问题在于您自己将serialUID定义为静态常量:

private static final long serialVersionUID = 3L;
此UID用于确定类路径中的类是否与输入对象的类兼容。因此,我怀疑您在没有更改serialVersionUID的情况下修改了类。这使ObjectInputStream认为是兼容的,但您仍在使用旧数据。尝试清除旧数据,然后重新启动一个新的
save()
调用



您确定
Input
也可以序列化吗?该类的UID是否未损坏?

似乎可序列化不喜欢类成员字段中的空值。
如果我确保所有类成员都有实际内存,那么它不会失败。

除非Android Java开发中出现了很大的不同,否则我认为您不需要为该对象实现自己的序列化算法。我是否缺少某些内容?是否尝试加载在更改表达式类定义之前保存的序列化对象?以前存储的内容已被删除@那是什么意思实现我自己的算法?我只是在添加可序列化的工具。现在我可以做的就是使用字符串。。。问题似乎是类的修改导致了一些失败。字符串的使用非常有效。我已经尝试过多次修改serialVersionUID,但没有任何效果。很久以前被删除的那个旧的。通过调试,我可以看到新数据正在被保存,但是我尝试加载它的readObject()抛出了一个异常,如果可能的话,您可以共享输入类吗?表达式和输入类也不是内部类,对吗?这里有一些非常糟糕的建议。没有理由修改serialVersionUID,除非您有意造成与所有旧数据不兼容,而且您永远不应该这样做。序列化广泛支持类版本控制,任何序列化的设计者/用户都应该熟悉。如果您有任何机会超出了允许的兼容clas更改范围(范围很广),您应该尽一切努力通过各种可用的额外技术来保持兼容性。肆意更改serialVersionUID只会暴露出对系统的不熟悉。