对象流

对象流的好处:

1、增强了缓冲区功能

2、增强了读写8种基本数据类型和字符串功能:readByte()、writeByte()、readChar()、writeChar()等。 

3、增强了读写对象的功能:readObject()、writeObject(Object obj)。

 序列化和反序列化:

使用流传输对象的过程就叫做序列化、反序列化。

序列化指的是将java对象转换为字节的过程。

反序列化指的是将字节恢复成对象的过程。

首先创建一个对象类

package com.exam.domain;

import java.io.Serializable;

/**
 * @Author: wangwang
 * @Date: 2022-12-13-3:47
 * @Description:
 */
//需要实现Serializable接口,来标识当前类可以用做序列化操作
public class User implements Serializable {

    /**
     * 版本号
     * 为了兼容不容版本的差异,如果版本号发生改变,在反序列化过程中就会因为版本号差异无法正常反序列化
     */
    private static final long serialVersionUID = 1L;

    public User() {
    }

    //使用有参构造函数完成对象初始化操作
    public User(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    private String name;

    private int age;
    //可以使用transient注解,来标识该属性不需要序列化操作
    private transient String sex;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

  

1、ObjectInputStream(对象输入流)

  

/**
 * 序列化
 *
 * @Author: wangwang
 * @Date: 2022-12-13-0:50
 * @Description:
 */
public class InputStreamDemo {

    public static void main(String[] args) throws Exception {
        //创建文件输出流对象,指定输出文件地址
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\stu\\eee.txt");
        //创建对象输出流,传入文件输出流对象
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        //创建对象
        User user = new User("小明", 19, "男");
        //输出对象信息到文件中
        objectOutputStream.writeObject(user);
        //关闭对象输出流
        objectOutputStream.close();
    }
}

  

2、ObjectOutputStream(对象输出流)

/**
 * 反序列化
 *
 * @Author: wangwang
 * @Date: 2022-12-13-0:50
 * @Description:
 */
public class InputStreamDemo {

    public static void main(String[] args) throws Exception {
        //创建文件输入字节流对象,定义输入文件地址
        FileInputStream fileInputStream = new FileInputStream("D:\\stu\\eee.txt");
        //定义对象输入数据流,指定文件输出流对象
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        //读取文件数据
        User user = (User) objectInputStream.readObject();
        //这里如果数据读取完毕后再次读取,会发生EOFException异常,表示数据已经读取完毕了,没有数据可以继续读取了。
//        User user1 = (User) objectInputStream.readObject();
        //操作对象数据
        System.out.println(user.toString());
        //关闭对象输入流
        objectInputStream.close();
    }
}

 

序列化、反序列化注意事项:

1、需要序列化的类必须实现Serializable接口,否则会报NotSerializableException:不可序列化异常。

2、如果类中存在对象属性,则该对象属性也要实现Serializable接口。

3、尽量自定义序列化版本号,保证序列化和反序列化的是同一个类。

4、可以使用transient关键字修饰列表的成员属性。表明该属性不参与序列化操作。

5、静态属性不参与初始化。

6、序列化多个对象,可以使用集合实现。

  

使用集合反序列化多个对象

/**
 * 使用集合反序列化多个对象
 *
 * @Author: wangwang
 * @Date: 2022-12-13-0:50
 * @Description:
 */
public class InputStreamDemo {

    public static void main(String[] args) throws Exception {
        //创建文件输出流对象,指定输出文件地址
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\stu\\eee.txt");
        //创建对象输出流,传入文件输出流对象
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        List<User> list = new ArrayList<>();
        //创建对象
        User user = new User("小明", 19, "男");
        User user1 = new User("小红", 20, "女");
        list.add(user);
        list.add(user1);
        //输出对象信息到文件中 这里输出一个集合信息
        objectOutputStream.writeObject(list);
        //关闭对象输出流
        objectOutputStream.close();
    }
}

 

使用集合序列化多个对象

/**
 * 使用集合序列化多个对象
 *
 * @Author: wangwang
 * @Date: 2022-12-13-0:50
 * @Description:
 */
public class InputStreamDemo {

    public static void main(String[] args) throws Exception {
        //创建文件输入字节流对象,定义输入文件地址
        FileInputStream fileInputStream = new FileInputStream("D:\\stu\\eee.txt");
        //定义对象输入数据流,指定文件输出流对象
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        //读取文件数据
        List<User> list = (List<User>) objectInputStream.readObject();
        //操作对象数据
        System.out.println(list.toString());
        //关闭对象输入流
        objectInputStream.close();
    }
}

  

posted @ 2022-12-13 03:42  Amireux-126  阅读(14)  评论(0)    收藏  举报