因此,假设我在 Java 中有一个类,它存储数据,我获取一个对象并将其序列化并将其保存到文件中。我有另一个具有完全相同类的项目,但它仍然在另一个文件中定义。我可以在该项目中获取我保存的文件并对其进行反序列化吗?
5 回答
我认为只要类名和类名serialVersionUID
相同,这应该可行。
是的,假设各个项目具有相同(或兼容)的“.class”文件用于相关类。
序列化然后反序列化对象本质上会创建它的副本。序列化然后反序列化时不会保留对象标识。保留的是序列化中对象的状态以及与其他对象的关系。
将此与以下内容进行对比:
正交持久性——系统确保只有一个对象,并且
对象关系映射——可能存在多个内存副本,但系统可以将它们与数据库中的“主”副本同步。
这就是序列化的目的。它允许您将对象从一个 Java 应用程序传递到另一个在不同 JVM 和不同计算机上工作的 Java 应用程序。它可以通过文件或网络或数据库来完成。
如果您指定serialVersionUID,那将是可能的。
UPD:流唯一标识符是类名、接口类名、方法和字段的 64 位散列。
所以如果你的类实现了不同的接口,你就会面临一个问题。为可序列化类指定 serialVersionUID 的任何方式都是一个好习惯。
注意 - 强烈建议所有可序列化的类都显式声明 serialVersionUID 值,因为默认的 serialVersionUID 计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能会在反序列化期间导致意外的 serialVersionUID 冲突,从而导致反序列化失败。
我有另一个具有完全相同类的项目,但它仍然在另一个文件中定义。
换句话说,它几乎肯定是一个不同的类,除非源代码被声明在同一个包中,在这种情况下,首先将它放在两个或多个单独的文件中是零点。两个不同包中的相似源代码不是同一个类,是两个不同的类,一个不能反序列化为另一个。