序列化流和反序列化流

序列化流

ObjectOutputStream 序列化流/对象操作输出流

包装基本流,属于字节流的一种,负责输出数据。可以把Java中的对象写到本地文件中去。

构造方法:

public ObjectOutputStream(OutputStream out)把基本流包装成高级流

成员方法:

public final void writeObject(Object obj)把对象序列化(写出)到文件中去

序列化流的小细节:使用对象输出流将对象保存到文件时会出现NotSerializableException异常

解决方案:需要让Javabean类实现Serializable接口。Serializable接口里面是没有抽象方法,是标记型接口,一旦实现了这个接口,那么就表示当前的Javabean类可以被序列化。

public class ObjectStreamDemo1 {
    public static void main(String[] args) throws IOException {
        /*
           需求:
                利用序列化流/对象操作输出流,把一个对象写到本地文件中

           构造方法:
                public ObjectOutputStream(OutputStream out)         把基本流变成高级流

           成员方法:
                public final void writeObject(Object obj)           把对象序列化(写出)到文件中去

        */
        //1.创建对象
        Student stu = new Student("zhangsan",23);
        //2.创建序列化流的对象/对象操作输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myio\\a.txt"));
        //3.写出数据
        oos.writeObject(stu);
        //4.释放资源
        oos.close();
    }
}

Javabean类:

/*
*
* Serializable接口里面是没有抽象方法,标记型接口
* 一旦实现了这个接口,那么就表示当前的Student类可以被序列化
* 理解:
*       一个物品的合格证
* */
public class Student implements Serializable {
    private String name;
    private int age;


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

反序列化流

ObjectInputStream 反序列化流/对象操作输入流

可以把序列化到本地文件中的对象,读取到程序中来。

构造方法:

public ObjectInputStream(InputStream out)把基本流变成高级流

public Object readObject()把序列化到本地文件中的对象,读取到程序中来

public class ObjectStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        /*
           需求:
                利用反序列化流/对象操作输入流,把文件中中的对象读到程序当中
           构造方法:
                public ObjectInputStream(InputStream out)         把基本流变成高级流
           成员方法:
                public Object readObject()                        把序列化到本地文件中的对象,读取到程序中来
        */

        //1.创建反序列化流的对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myio\\a.txt"));
        //2.读取数据
//        Object o = ois.readObject();
        Student o = (Student) ois.readObject();
        //3.打印对象
        System.out.println(o);
        //4.释放资源
        ois.close();
    }
}

序列化流/反序列化流的细节汇总

1、使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常。

2、序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。

3、序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?

会,报InvalidClassException异常,因为文件中的版本号,跟Javabean中的版本号不匹配。

解决方法:给Javabean类添加 serialVersionUID(序列号、版本号)

方法1:手动添加

private static final long serialVersionUID=1L;

方法2:idea设置以下选项  

可以自动生成版本号,点击类名Alt+Enter选择以下选项

4、如果一个对象中的某个成员变量的值不想被序列化,如何实现?

解决方案:

给该成员变量加 transient 瞬态关键字修饰,该关键字标记的成员变量不参与序列化过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梧桐小玉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值