序列化ObjectOutputStream和反序列化ObjectInputStream的流

序列化ObjectOutputStream和反序列化ObjectInputStream的流

在java中要将对象写入并持久化(保存) 并且能够还原回来
这个时候就需要序列号和反序列化了
用来操作序列号和反序列号的流
improt java.io.*; 引用io
ObjectOutputStream 序列号
ObjectInputStream 反序列号
序列化需要满足一些条件
第一对象可以被序列化 可以实现Serializable
第二一定要写一个全局常量 序列化id
serialVersionUID 这个id如果你不写的话 系统会自动根据你的类进行生成 如果你
改变了这个类 这个id也会随之改变
序列化的机制就是 将对象转成无关平台的二进制流
对象转成 二进制流 叫做序列化
二进制流转成对象 叫反序列化
serialVersionUID 就是用来标识版本的 如果你的serialVersionUID不一致的就无法反序列化回来

实体类需要实现 Serializable 接口,否则无法被序列化

序列化
void write(String path){
    OutputStream  outputStream = null;
    try {
        // 创建一个输出流
        outputStream = new FileOutputStream(path);
        // 创建一个缓冲流
        outputStream = new BufferedOutputStream(outputStream);
        // 创建一个序列号流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        User user = new User("安然的尾巴",18);
        // 将对象写入序列化流
        objectOutputStream.writeObject(user);
        // 关闭流
        objectOutputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch (IOException e) {
        e.printStackTrace();
    }
}
反序列化
    void reader(String path){
        InputStream inputStream = null;
        try {
            // 创建一个输入流
            inputStream = new FileInputStream(path);
            // 创建一个缓冲流
            inputStream = new BufferedInputStream(inputStream);
            // 创建一个反序列化流
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            // 从反序列化流中读取出Object对象
            Object object = objectInputStream.readObject();
            User user = (User)object;
            System.out.println(user.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
User类
//Serializable表示可以被序列化
class User implements Serializable{
    private String name;
    private int age;
    //transient不可被序列化
    public transient int id;
    public User(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String toString(){return "名字:" + name +"年龄:" + age;}
}
序列化集合List
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Serialize{
    public static void main(String[] args){
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        Serialize serialize = new Serialize();
        serialize.write(list);

        List<String> lists = serialize.read();
        for(String str:lists){
            System.out.println(str);
        }
    }
    public void write(List<String> list){
        try {
            FileOutputStream outputStream = new FileOutputStream("ll.dwb");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
            objectOutputStream.writeObject(list);
            objectOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public List<String> read(){
        List<String> list = null;
        try {;
            FileInputStream inputStream = new FileInputStream("ll.dwb");
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            Object object  = null;
            object = objectInputStream.readObject();
            list = (List<String>)object;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return list;
    }
}