【问题标题】:Can two classes that are the same be serialized and unserialized?两个相同的类可以序列化和反序列化吗?
【发布时间】:2013-02-22 10:05:41
【问题描述】:

假设我在 Java 中有一个类,它存储数据,我获取一个对象并将其序列化并将其保存到文件中。我有另一个具有完全相同类的项目,但它仍然在另一个文件中定义。我可以在那个项目中获取我保存的文件并对其进行反序列化吗?

【问题讨论】:

标签: java class object serialization


【解决方案1】:

我有另一个项目具有完全相同的类,但它仍然在另一个文件中定义。

换句话说,它几乎肯定是一个不同的类,除非源代码被声明在同一个包中,在这种情况下,将它放在两个或多个单独的包中是零点文件放在首位。两个不同包中的相似源代码不是同一个类,是两个不同的类,一个不能像另一个反序列化。

【讨论】:

【解决方案2】:

如果您指定serialVersionUID,那将是可能的。

UPD:流唯一标识符是类名、接口类名、方法和字段的 64 位散列。

所以如果你的类实现了不同的接口,你就会面临一个问题。为可序列化类指定 serialVersionUID 的任何方式都是一种好习惯。

注意 - 强烈建议所有可序列化的类都显式声明 serialVersionUID 值,因为默认的 serialVersionUID 计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能在反序列化期间导致意外的 serialVersionUID 冲突,从而导致反序列化失败。

Stream Unique Identifiers

【讨论】:

  • 其实不需要指定,只要是一样的,全限定类名也是一样的。
  • 不仅限定名称和方法很重要。
【解决方案3】:

是的,假设各个项目对于相关类具有相同(或兼容)的“.class”文件。

序列化然后反序列化一个对象本质上会创建它的副本。序列化然后反序列化时不会保留对象标识。保存的是序列化中对象的状态以及与其他对象的关系。

对比:

  • 正交持久性 - 系统确保只有一个对象,并且

  • 对象关系映射 - 内存中可能存在多个副本,但系统可以将它们与数据库中的“主”副本同步。

【讨论】:

    【解决方案4】:

    这就是序列化的目的。它允许您将对象从一个 Java 应用程序传递到另一个在不同 JVM 和不同计算机上工作的 Java 应用程序。可以通过文件、网络或数据库来完成。

    【讨论】:

      【解决方案5】:

      我认为只要类名和serialVersionUID 相同,这应该可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-04
        • 2021-09-15
        • 2010-09-19
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多