对象序列化的问题

时间:2011-04-29 07:55:25

标签: java serialization

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

首先,我的课程原来是以下字符串“A”,“B”,“C” 我用一些数据保存了文件......

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

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

任何帮助请...

1 个答案:

答案 0 :(得分:3)

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

来自JavaDoc on Serializable

序列化运行时将每个可序列化类与版本号相关联,称为serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已加载与该序列化兼容的该对象的类。 如果接收者已经为具有与相应发送者类的serialVersionUID不同的对象加载了一个类,则反序列化将导致InvalidClassException。可序列化类可以通过声明a明确声明其自己的serialVersionUID名为“serialVersionUID”的字段,必须是static,final和long类型:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

(由我标记)

编辑:

作为替代方案,您可以使用另一个字段来存储版本并反序列化,尽管类更改。在这种情况下,新字符串应初始化为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();
}