Java实现序列化机制

    科技2025-04-16  15

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

    序列化:将对象写入到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

    Processed: 0.009, SQL: 8