IO流 六、对象的序列化与反序列化

6-1 序列化的基本操作

对象的序列化,反序列化

1)对象序列化就是将Object对象转化成byte序列,反之叫对象的反序列化

2)序列化流(ObjectOutputStream),是个过滤流 --- writeObjcet

      反序列化流(ObjectInputStream), --- readObject

3)序列化接口(Serializable)

对象必须实现序列化接口,才能进行序列化,否则将出现异常

这个接口,没有任何方法,只是一个标准

package com.io;

import java.io.Serializable;

public class Student implements Serializable{
    private String stuno;
    private String stuname;
    private int stuage;
    public Student() {    
    }
    
    public Student(String stuno, String stuname, int stuage) {
        super();
        this.stuno = stuno;
        this.stuname = stuname;
        this.stuage = stuage;
    }
    @Override
    public String toString() {
        return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + "]";
    }
}
 

package com.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectSeriaDemo1 {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        String file = "demo/obj.dat";
        // 1.对象的序列化
        /*
         * ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
         * Student stu = new Student("1001", "张三", 20); oos.writeObject(stu);
         * oos.flush(); oos.close();
         */
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        Student stu = (Student) ois.readObject();
        System.out.println(stu);

    }

}
 

 

6-2 transient及ArrayList源码分析

private transient int stuage;// 该元素不会进行jvm默认的序列化,也可以自己完成这个元素的序列化

transient关键字

private void writeObject(java.io.ObjectOutputStream s) throws IOException {
        s.defaultWriteObject(); // 把jvm能默认序列化的元素进行序列化操作
        s.writeInt(stuage); // 自己完成stuage的序列化
    }

private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException {
        s.defaultReadObject(); // 把jvm能默认反序列化的元素进行反序列化操作
        this.stuage = s.readInt(); // 自己完成stuage的反序列化操作
    }

分析ArrayList源码中序列化和反序列化的问题

  • 有效元素序列化,提高性能

 

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

package com.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class ObjectSeriaDemo {

    public static void main(String[] args) throws Exception {

        // ObjectOutputStream oos = new ObjectOutputStream(new
        // FileOutputStream("demo/obj1.dat"));
        // Foo2 foo2 = new Foo2();
        // oos.writeObject(foo2);
        // oos.flush();
        // oos.close();

        // 反序列化是否递归调用父类构造函数
        // ObjectInputStream ois = new ObjectInputStream(new
        // FileInputStream("demo/obj1.dat"));
        // Foo2 foo2 = (Foo2)ois.readObject();
        // System.out.println(foo2);
        // ois.close();
        // 输出结果:com.io.Bar1@34340fab

        // ObjectOutputStream oos = new ObjectOutputStream(new
        // FileOutputStream("demo/obj1.dat"));
        // Bar1 bar1 = new Bar1();
        // oos.writeObject(bar1);
        // oos.flush();
        // oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("demo/obj1.dat"));
        Bar1 bar1 = (Bar1) ois.readObject();
        System.out.println(bar1);
        ois.close();
        // 输出结果:bar com.io.Bar1@34340fab

        /*
         * 对子类对象进行反序列化操作时 如果其父类没有实现序列化接口 那么其父类的构造函数会被调用
         */

    }

}

/*
 * 一个类实现了序列化接口,其子类都可以序列化
 */
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 implements Serializable {
    public Bar1() {
        System.out.println("bar1");
    }
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值