【问题标题】:Java Serializable failureJava 可序列化失败
【发布时间】:2023-03-28 12:40:02
【问题描述】:

我有一个名为 Expression 的类,我尝试使用以下 load()/save() 函数进行序列化。在对我的代码和 Expression 类进行了一些更改后,它曾经运行良好,对 in.readObject() 的调用会引发 ClassCastException。 错误信息是: java.lang.ClassCastException: java.lang.String 无法转换为 java.io.ObjectStreamClass

【问题讨论】:

  • 除非在 Android Java 开发上有很大不同,否则在我看来,您不需要为这个对象实现自己的序列化算法。我错过了什么吗?
  • 您是否尝试加载在更改 Expression 类定义之前保存的序列化对象?
  • 之前存储的内容已被删除。 @thatidiotguy 你是什么意思实现我自己的算法?我只是添加实现可序列化。

标签: java android serializable


【解决方案1】:

对我来说,将二进制数据存储为字符串感觉非常糟糕。尝试使用更稳定的方式来存储 ObjectOutputStream 的二进制输出。如果您真的想坚持使用字符串格式的方法,请尝试使用 Base64 编码,这始终是安全的。


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

private static final long serialVersionUID = 3L;

此 UID 用于确定类路径中的类是否与输入对象的类兼容。所以我怀疑你修改了类而不改变serialVersionUID。这使得 ObjectInputStream 认为这是兼容的,但您仍在使用旧数据。尝试删除旧数据,然后重新调用save()


你确定Input 也是可序列化的吗?该类的 UID 没有损坏?

【讨论】:

  • 使用字符串是我现在可以做的......问题似乎是导致一些失败的类的修改。使用字符串效果很好
  • 我试过多次修改serialVersionUID,没有任何效果。那个很久以前就被删除的旧了。通过调试我可以看到正在保存新数据,但我尝试加载它 readObject() 抛出异常,
  • 如果可以的话,可以分享一下Input类吗?表达式和输入类也不是内部类,对吧?
  • 这里有一些非常糟糕的建议。没有理由修改 serialVersionUID 除非您故意要导致与所有旧数据不兼容,并且您永远不应该这样做。序列化对类版本控制有广泛的支持,任何序列化的设计者/用户都应该熟悉。如果您有任何机会超出了允许的兼容类更改范围,那么您应该尽一切努力通过各种可用的额外技术来保持兼容性。乱改serialVersionUID就是对系统不熟悉。
【解决方案2】:

似乎可序列化不喜欢类成员字段中的 NULL 值。 如果我确保所有班级成员都有实际记忆,它不会失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多