为了账号安全,请及时绑定邮箱和手机立即绑定

关于父类没有无参构造函数的反序列化问题

有没有发现一个问题,如果我们定义三个类Bar  Bar1  Bar2,其中Bar2实现了serializable接口,Bar1没有无参构造函数,那么在对Bar2进行反序列化的时候会抛出异常,请问这种情况应该怎么解决呀

正在回答

3 回答

我这里用你的没有一点问题诶  是不是main函数有问题

你把序列、反序列封装成函数,那我的main函数是这样的:

ObjectOutputStream oos = new ObjectOutputStream(

                new FileOutputStream("demo/obj2.dat")

        );

        Bar2 bar2 = new Bar2();

        oos.writeObject(bar2);

        oos.flush();

        oos.close();


//        ObjectInputStream ois = new ObjectInputStream(

//                new FileInputStream("demo/obj2.dat")

//        );

//        Bar2 bar2 = (Bar2)ois.readObject();

//        System.out.println(bar2);

//        ois.close();


1 回复 有任何疑惑可以回复我~
#1

qq_Divergent_2 提问者

找到问题了,我貌似忘记序列化了[?]
2018-03-03 回复 有任何疑惑可以回复我~
#2

zjxjwxk 回复 qq_Divergent_2 提问者

那是我第一个回答???
2018-03-03 回复 有任何疑惑可以回复我~
class Bar {
 Bar()
 {
  a = 1;
  System.out.println("Bar..." + a);
 }
 protected int a;
}
class Bar1 extends Bar implements Serializable
{
 Bar1(double b)
 {
  this.b = b;
  System.out.println("Bar1..." + b);
 }
 Bar1()
 {
  this.b = 1.5;
  System.out.println("Bar1..." + b);
 }
 protected double b;
}
class Bar2 extends Bar1 
{
 /**
  * 
  */
 private static final long serialVersionUID = 270589360374420361L;
 Bar2()
 {
  super();
  c = 3;
  System.out.println("Bar2..." + c);
 }
 protected int c;
 
}
代码是这样的,主函数里面是:
String file = "C:\\JAVA\\1.txt";
  Bar2 bar2 = new Bar2();
  
//  objectSerialize(bar2, file);
 
  objectDeserialize(bar2, file);
  
  System.out.println(bar2);
  
抛出了一坨异常:
Exception in thread "main" java.io.InvalidClassException: com.clcl.io.Bar1; local class incompatible: stream classdesc serialVersionUID = 7973625721886668699, local class serialVersionUID = -1556330232670652696
 at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689)
 at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1894)
 at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1763)
 at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1894)
 at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1763)
 at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2051)
 at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1585)
 at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
 at com.clcl.io.FileTest.objectDeserialize(FileTest.java:83)
 at com.clcl.io.FileTest.main(FileTest.java:44)


0 回复 有任何疑惑可以回复我~
#1

zjxjwxk

你确定是这个版本的代码? 和问的不一样啊
2018-03-02 回复 有任何疑惑可以回复我~
#2

zjxjwxk

我觉得你说的Bar1没有无参构造函数的话 那Bar2的super()不是要报错了嘛
2018-03-02 回复 有任何疑惑可以回复我~
#3

qq_Divergent_2 提问者 回复 zjxjwxk

Bar1(double b) { this.b = b; System.out.println("Bar1..." + b); } Bar1() { this.b = 1.5; System.out.println("Bar1..." + b); } bar1是有无参构造函数的
2018-03-02 回复 有任何疑惑可以回复我~
#4

qq_Divergent_2 提问者 回复 zjxjwxk

问的时候可能描述的有点问题,具体的问题看代码吧,表述能力有点问题[笑哭]
2018-03-02 回复 有任何疑惑可以回复我~
查看1条回复

我试了一下没有问题呀

需要注意的是,如果你修改了Bar1就需要重新序列化一次

不能直接进行反序列的吧?

0 回复 有任何疑惑可以回复我~
#1

qq_Divergent_2 提问者

我的代码看我的评论吧,回复有字数限制,谢谢啦
2018-03-02 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于父类没有无参构造函数的反序列化问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信