在更改原始类方法后反序列化java类

时间:2014-01-14 18:36:03

标签: java serialization

我在项目中有一个AJavaClass.java中的java类,说MyFirstProject

package mypackage;

class AJavaClass implements java.io.Serializable{
      //instance variables
      int var1;
      int var2;
      String stringVar1;
      AJavaClass(arg1,arg2){
           aJavaClassMethod(arg1,arg2);
      }
      public void aJavaClassMethod(arg1,arg2){
      }

}

在另一个项目中,比如MySecondProject,我在该项目中具有相同的类和相同的命名包,但结构略有不同:

package mypackage;
class AJavaClass java.io.Serializable{
      //instance variables
      int var1;
      int var2;
      String stringVar1;
      //note 4 param constructor
      AJavaClass(arg1,arg2,arg3,arg4){
           aJavaClassMethod(arg1,arg2,arg3,arg4);
      }
      //note 4 param method but with same name
      public void aJavaClassMethod(arg1,arg2,arg3,arg4){
      }

}

现在我比MySecondProject更早创建了MyFirstProject。然后我将AJavaClass的几个实例序列化到一个目录中。 但是后来,由于一些非常真实的原因,我需要更新AJavaClass,以便aJavaClassMethod接受4个params。现在的问题是,当我尝试使用MyFirstProject的AJavaClass反序列化由MySecondProject的AJavaClass序列化的对象时,它给了我java.io.InvalidClassException:

那么有什么方法可以使用MyFirstProject中MySecondProject的AJavaClass序列化的对象?(请注意,类中没有零参数构造函数,因此排除了继承)。

2 个答案:

答案 0 :(得分:1)

  

那么有什么办法可以在MyFirstProject中使用MySecondProject的AJavaClass序列化的对象吗?

是。异常消息告诉您实际和预期的serialVersionUID`值。只需将期望值放入该类的新版本中:

private static final long serialVersionUID = 123456789L;  // or whatever the message says

事实上,如果它仍然存在,也将它放入旧版本。

答案 1 :(得分:-1)

除非您恢复到编写序列化数据时存在的类结构,否则您将无法获取数据。如果没有定义serialVersionUID,那么Java会根据类结构生成一个InvalidClassException。如果类的序列号与文件的序列号不同,您将获得{{1}}。

如果数据至关重要,请还原该类并获取数据。如果你真的想要你可以拥有该类的两个版本并编写一个方法来加载文件,那么创建一个最新类的实例并将其写回数据。