Java 对象序列化问题

Java 对象序列化问题,java,serialization,Java,Serialization,保存对象序列化然后再次加载时出现问题 首先,我用下面的字符串“A”,“B”,“C”来上课 我保存了一些数据到文件中 后来我修改了这个类,使它多了一个字符串“D”。 加载在修改应用程序之前保存的文件后,应用程序不知道新字符串“D” 处理此类问题的最佳机制是什么。。。将数据从旧对象复制到新对象将非常漫长。。。我想让保存的对象知道有一些结构更改 任何帮助请…使用不同的serialVersionUID告诉系统有不同的版本 从: 序列化运行时将一个版本号(称为serialVersionUID)与每个可

保存对象序列化然后再次加载时出现问题

首先,我用下面的字符串“A”,“B”,“C”来上课 我保存了一些数据到文件中

后来我修改了这个类,使它多了一个字符串“D”。 加载在修改应用程序之前保存的文件后,应用程序不知道新字符串“D”

处理此类问题的最佳机制是什么。。。将数据从旧对象复制到新对象将非常漫长。。。我想让保存的对象知道有一些结构更改


任何帮助请…

使用不同的
serialVersionUID
告诉系统有不同的版本

从:

序列化运行时将一个版本号(称为serialVersionUID)与每个可序列化类关联,该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否为该对象加载了与序列化兼容的类。如果接收方为对象加载的类的SerialVersionId与相应发送方的类的SerialVersionId不同,则反序列化将导致InvalidClassException。可序列化类可以通过声明名为“serialVersionUID”的字段显式声明自己的serialVersionUID,该字段必须是静态的、最终的且类型为long:

ANY-ACCESS-MODIFIER静态最终长serialVersionUID=42L

(由我负责)

编辑:

作为替代方案,您可以使用另一个字段来存储版本并进行反序列化,尽管类发生了更改。在这种情况下,新字符串应该初始化为null。然后,您可以检查该版本,以查看该字符串是否存在于以前的版本中,并且在保存时仅为null,或者在保存期间是否存在结构更改

例如:

class MyObject {
   private static final versionUid = 1;
   private final int version;

   private String a, b, c, d; //plus getters/setters;

   public MyObject() {
     version = versionUid ; //needed if you want to load objects of different backward compatible versions and still know the version after deserialization
   }

   public int getVersion() {
     return version;
   }
}


MyObject readObjectOfVersion2 = ... ;//deserialize an object of version 1
if( readObjectOfVersion2.getVersion() > 1 ) {//assuming version 1 only has a,b,c and version 2+ has d as well    
  String d = readObjectOfVersion2.getD();
}

使用不同的
serialVersionUID
告诉系统有不同的版本

从:

序列化运行时将一个版本号(称为serialVersionUID)与每个可序列化类关联,该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否为该对象加载了与序列化兼容的类。如果接收方为对象加载的类的SerialVersionId与相应发送方的类的SerialVersionId不同,则反序列化将导致InvalidClassException。可序列化类可以通过声明名为“serialVersionUID”的字段显式声明自己的serialVersionUID,该字段必须是静态的、最终的且类型为long:

ANY-ACCESS-MODIFIER静态最终长serialVersionUID=42L

(由我负责)

编辑:

作为替代方案,您可以使用另一个字段来存储版本并进行反序列化,尽管类发生了更改。在这种情况下,新字符串应该初始化为null。然后,您可以检查该版本,以查看该字符串是否存在于以前的版本中,并且在保存时仅为null,或者在保存期间是否存在结构更改

例如:

class MyObject {
   private static final versionUid = 1;
   private final int version;

   private String a, b, c, d; //plus getters/setters;

   public MyObject() {
     version = versionUid ; //needed if you want to load objects of different backward compatible versions and still know the version after deserialization
   }

   public int getVersion() {
     return version;
   }
}


MyObject readObjectOfVersion2 = ... ;//deserialize an object of version 1
if( readObjectOfVersion2.getVersion() > 1 ) {//assuming version 1 only has a,b,c and version 2+ has d as well    
  String d = readObjectOfVersion2.getD();
}

很抱歉,我刚刚了解了序列化。。你能说得更具体些吗?你能给我一些示例代码吗?所以我仍然可以加载我的旧文件。。因为当我尝试使用新结构-->java.io.InvalidClassException:com.joymaster.hypereditor.data.TreeScriptContent加载旧文件时出现此错误;本地类不兼容:stream classdesc serialVersionUID=-3425667071755815337,本地类serialVersionUID=-916187445672973996很抱歉,我刚刚了解了序列化。。你能说得更具体些吗?你能给我一些示例代码吗?所以我仍然可以加载我的旧文件。。因为当我尝试使用新结构-->java.io.InvalidClassException:com.joymaster.hypereditor.data.TreeScriptContent加载旧文件时出现此错误;本地类不兼容:流classdesc serialVersionUID=-3425667071755815337,本地类serialVersionUID=-916187445672973996