一、序列化的含义,使用意义,使用场景

  • 序列化:将对象写入到IO流中
  • 反序列化:从IO流中恢复对象
  • 意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
  • 使用场景:所有可在网络上传输的对象都必须是可序列化的,传入的参数或返回的对象都是可序列化的,否则会出错;所有需要保存到磁盘的java对象都必须是可序列化的。通常建议:程序创建的每个JavaBean类都实现Serializeable接口。

二、实现序列化机制

这里讲的时平时用的比较多的方法,实现Serializable,每个实现了Serializable接口的实体类都可以被序列化和反序列化

创建实体类

package cn.kexing.bean;
import java.io.Serializable;

public class User implements Serializable {
    //设置User类序列化版本号
    private static final long serialVersionUID = 1642373918479262059L;
    private int id;
    private String name;
    private transient String position;

    public User(){}

    public User(int id, String name, String position) {
        this.id = id;
        this.name = name;
        this.position = position;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

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

创建序列化版本号的好处

在 序列化存储/反序列化读取 或者是 序列化传输/反序列化接收 时,JVM 会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

如何让IDEA自动生成serialVersionUID

进入setting - >
在这里插入图片描述
设置完后鼠标移到需要添加序列化版本号的类上 alt+回车可由idea自动根据实体类、接口名等生成一个不会重复的哈希字段

防止字段被序列化

transient关键字可以防止字段被序列化,在实体类属性前加上transient 关键字,当实体类被序列化和反序列化时,该属性会始终为该数据类型的初始值

ObjectOutputStream序列化对象

package cn.kexing.Serialization;
import cn.kexing.bean.User;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 序列化Student 与 User 对象
 */
public class ObjectOutputStream01 {
                public static void main(String[] args) {
                    try {
                        List<User> list = new ArrayList<>();
                        list.add(new User(001,"zhangsan","teacher1"));
                        list.add(new User(002,"lisi","teacher2"));
                        list.add(new User(003,"wangwu","teacher3"));
                        list.add(new User(004,"zhaoliu","teacher4"));
                        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\IDEA_workspace\\serialization\\src\\a.txt"));
                        oos.writeObject(list);
                        oos.flush();
                        oos.close();

                    } catch (IOException e) {
                        e.printStackTrace();
        }

    }
}

D:\IDEA_workspace\serialization\src下生成文件:a.txt
序列化后文件

 sr java.util.ArrayListx佉櫱a� I sizexp   w   sr cn.kexing.bean.User梪I襯3!� I idL namet Ljava/lang/String;xp   t zhangsansq ~    t lisisq ~    t wangwusq ~    t zhaoliux

ObjectInputStream反序列化

package cn.kexing.Serialization;

import cn.kexing.bean.User;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.List;

public class ObjectInputStream01 {
    public static void main(String[] args) {
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\IDEA_workspace\\serialization\\src\\a.txt"));
            List<User> list = (List<User>) ois.readObject();
            System.out.println(list instanceof List);
            for(User user: list){
                System.out.println(user);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
true
User{id=1, name='zhangsan', position='null'}
User{id=2, name='lisi', position='null'}
User{id=3, name='wangwu', position='null'}
User{id=4, name='zhaoliu', position='null'}

position字段由于被设置为禁止序列化,所以这里的值为null

最后修改:2021 年 11 月 15 日 05 : 19 PM
如果觉得我的文章对你有用,请随意赞赏