首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改原始类方法后反序列化java类

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

Stack Overflow用户
提问于 2014-01-14 18:36:03
回答 2查看 760关注 0票数 0

我在一个项目中的AJavaClass.java文件中有一个java类,比如MyFirstProject。

代码语言:javascript
复制
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,我在该项目中有相同的类和相同的命名包,但结构略有不同:

代码语言:javascript
复制
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){
      }

}

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

那么,我是否可以在AJavaClass中使用由MySecondProject项目的MyFirstProject序列化的对象?(请注意,类中没有零arg构造函数,因此排除了继承)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-14 20:53:17

那么,我是否可以在AJavaClass中使用由MySecondProject项目的MyFirstProject序列化的对象?

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

代码语言:javascript
复制
private static final long serialVersionUID = 123456789L;  // or whatever the message says

事实上,如果它仍然存在的话,也要把它放到旧版本中去。

票数 1
EN

Stack Overflow用户

发布于 2014-01-14 18:55:47

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

如果数据至关重要,则还原类并获取数据。如果您真的想要的话,可以使用类的两个版本并编写一个方法来加载文件,创建一个最新类的实例并将其写回数据。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21121305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档