序列化和反序列化

一、什么是序列化和反序列化

(1 Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;

(2 ** 序列化 :**对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。

(3 ** 反序列化**客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。


二、子父类之间的序列化和反序列化

当一个可序列化子类有多个父类(直接和间接)的时候,这些父类必须都满足以下条件之一,该子类才能被反序列化
1、拥有无参数构造器
2、也可序列化
因为反序列化子类的时候,程序根据字节流中保存的对象的信息,对父类也进行初始化

当父类不能序列化的时候,在反序列化时,程序会去调用父类的无参构造器去初始化父类的变量(所以父类不能序列化的时候必须有无参构造器),该父类中的定义的实例变量不会序列化到流中。

public class ObjectIODemo2 {
    public static void main(String[] args) {
        try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Object"));
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Object")) ) {
            Son1 son1 = new Son1("Father");
            /*
                序列化子类Son1的对象
                反序列化子类
             */
            oos.writeObject(son1);
            Son1 s = (Son1)ois.readObject();
            s.getAll();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
class Father {
    String name = null;
    private int age = 40;
    //父类定义一个含参构造器
    public Father(String name){
        this.name = name;
        System.out.println("父类有参构造器");
    }
    //父类定义一个无参构造器
    public Father() {
        System.out.println("父类无参构造器");
    }
}

class Son1 extends Father implements Serializable {
    String name = "Son1";
    private int age = 30;

    public Son1(String name) {
        super(name);
    }
    public void getAll() {
        System.out.println(super.name);
    }
}

当父类能序列化的时候,在反序列化时,程序会直接序列化父类,也不会去调用构造器,不存在上述情况

public class ObjectIODemo2 {
    public static void main(String[] args) {
        try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Object"));
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Object")) ) {
            Son1 son1 = new Son1("Father");
            /*
                序列化子类Son1的对象
                反序列化子类
             */
            oos.writeObject(son1);
            Son1 s = (Son1)ois.readObject();
            s.getAll();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
class Father implements Serializable {
    String name = null;
    private int age = 40;
    //父类定义一个含参构造器
    public Father(String name){
        this.name = name;
        System.out.println("父类有参构造器");
    }
    //父类定义一个无参构造器
    public Father() {
        System.out.println("父类无参构造器");
    }
}

class Son1 extends Father implements Serializable {
    String name = "Son1";
    private int age = 30;

    public Son1(String name) {
        super(name);
    }
    public void getAll() {
        System.out.println(super.name);
    }
}

当一个父类实现序列化,子类自动实现序列化,不需要显示实现Serializable接口
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值