JavaSE@拓展补遗@笔记08@BIO流@序列流反序列流介绍及常用方法

一、序列流【重点】

1、概述

序列流用于操作java的对象。

序列化流: 对象输出流,把对象输出到硬盘中做永久存储。

反序列化流:对象输入流。把硬盘中的对象输入到内存中来。

2、ObjectOutputStream类

构造方法

public ObjectOutputStream(OutputStream out) : 创建一个指定的ObjectOutputStream

写出对象方法

public final void writeObject (Object obj) : 将指定的对象写出。

常见的两个疑惑

Serializable这个接口我们称为是标记型接口,这个接口中没有任何的方法。

输出的对象在电脑中显示是乱码,这是正常的。因为windows根本就没有查看对象的方式。

代码演示

import java.io.Serializable;
public class Student implements Serializable{
    private String name;
    private int age;
    private String sex;
    private int score;
​
    //构造    set get  toString()
}
​
​
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
​
public class Test01_序列化流 {
    public static void main(String[] args) throws IOException {
        //创建对象
        //ObjectOutputStream(OutputStream out) : 创建一个指定的ObjectOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\jin\\Desktop\\对象.txt"));
        //创建学生对象
        Student s = new Student("老王",38,"男",99);
        //输出一个对象
        oos.writeObject(s);
        //关流
        oos.close();
    }
}

3、ObjectInputStream类

构造方法

public ObjectInputStream(InputStream in) : 创建一个指定的ObjectInputStream

读取对象方法

public final Object readObject() : 读取一个对象。

代码演示

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
​
public class Test02_反序列化流 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
​
        //创建反序列化对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\jin\\Desktop\\对象.txt"));
​
        //读取
        Object o = ois.readObject();
​
        //向下转型(把父类转成子类类型)
        Student stu = (Student) o;
​
        //打印
        System.out.println(stu);
​
    }
}

4、对象操作流的作用

对象操作流的功能就是输出和输入【对象】。

5、对象操作流的小知识点

transient关键字

//瞬态的。被修饰的成员变量不会被序列化。

//瞬态
private transient int score;

serialVersionUID编号

每个类其实都有一个编号,在自己不指定编号的时候,系统会分配一个编号,每次修改类编号都会自动变化。

在序列化和反序列化中间如果编号发生了改变,反序列化就会报错。

所以可以手动给定一个类的编号,手动给的编号是不会变化的。

private static final long serialVersionUID = -6834534345343443L;

序列化多个对象:

序列化的时候建议不要保存多次,如果有多个对象建议一次性输出。把多个对象保存在一个集合中,然后输出一个集合。

public class Test03_序列化流 {
    public static void main(String[] args) throws IOException {
        //创建对象
        //ObjectOutputStream(OutputStream out) : 创建一个指定的ObjectOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\jin\\Desktop\\对象.txt"));
        //创建学生对象
        Student s1 = new Student("老王",38,"男",99);
        Student s2 = new Student("小王",48,"男",69);
        Student s3 = new Student("大王",58,"男",79);
​
        //创建一个集合
        ArrayList<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
​
        //输出一个集合对象
        oos.writeObject(list);
​
        //关流
        oos.close();
    }
}
​
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
@SuppressWarnings("all")
public class Test04_反序列化流 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建反序列化对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\jin\\Desktop\\对象.txt"));
        //读取
        Object o = ois.readObject();
​
        //向下转型(把父类转成子类类型)
        ArrayList<Student> list = (ArrayList<Student>) o;
        //打印
        System.out.println(list);
​
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值