欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

序列化中子父类构造函数问题

程序员文章站 2022-04-04 09:09:49
...
一 介绍
1、如果父类实现了序列化接口,子类就不需要实现序列化接口。
2、创建对象的时候,递归调用了父类的构造函数。
3、对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被调用,否则不会被调用。
 
二 实例
package com.imooc.io;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
public class ObjectSeriaDemo2 {
    public static void main(String[] args) throws Exception{
         ObjectOutputStream oos = new ObjectOutputStream(
                 new FileOutputStream("demo/obj1.dat"));
         Foo2 foo1 = new Foo2();   //创建对象的时候,递归调用了父类的构造函数
         oos.writeObject(foo1);
         oos.flush();
         oos.close();
         
         //反序列化是否递归调用父类的构造函数,不能证明
         ObjectInputStream ois = new ObjectInputStream(
                 new FileInputStream("demo/obj1.dat"));
         Foo2 foo2 = (Foo2)ois.readObject();
         System.out.println(foo2);
         ois.close();
         
         
         ObjectOutputStream oos1 = new ObjectOutputStream(
                 new FileOutputStream("demo/obj1.dat"));
         Bar2 bar1 = new Bar2();
         oos1.writeObject(bar1);
         oos1.flush();
         oos1.close();
         
         ObjectInputStream ois1 = new ObjectInputStream(
                 new FileInputStream("demo/obj1.dat"));
         Bar2 bar2 = (Bar2)ois1.readObject();
         System.out.println(bar2);
         ois1.close();
         
         
         /*
          * 对子类对象进行反序列化操作时,
          * 如果其父类没有实现序列化接口
          * 那么其父类的构造函数会被调用
          */
    }
}
/*
 *   一个类实现了序列化接口,那么其子类都可以进行序列化
 */
class Foo implements Serializable{ 
    public Foo(){
         System.out.println("foo...");
    }
}
class Foo1 extends Foo{
    public Foo1(){
         System.out.println("foo1...");
    }
}
class Foo2 extends Foo1{
    public Foo2(){
         System.out.println("foo2...");
    }
}
class Bar{
    public Bar(){
         System.out.println("bar");
    }
}
class Bar1 extends Bar{
    public Bar1(){
         System.out.println("bar1..");
    }
}
class Bar2 extends Bar1 implements Serializable{
    public Bar2(){
         System.out.println("bar2...");
    }
}
 
三 运行结果
foo...
foo1...
foo2...
com.imooc.io.Foo2@913fe2
bar
bar1..
bar2...
bar
bar1..

 

com.imooc.io.Bar2@eb7859