io流-transient关键字和InvalidClassException异常的原理和解决方案

transient关键字_瞬态关键字

ObjectOutputStream类

ObjectOutputStream类 将java对象的原始数据类型写出文件 实现对象的持久存储

构造方法

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

序列化操作

1.一个对象想要序列化 编写满足两个条件:

  • 该类编写实现Serializable接口,Serializable是一个标记接口 不实现此接口的类将不会使然后状态序列化或反序列化 会抛出NotSerializableException
  • 该类的所有属性必须是可序列化的 如果有一个属性不需要可序列化的 则该属性必须注明是瞬态的 使用transient关键字修饰

InvalidClassException异常的原理和解决方案

另外,当JVM反序列化对象时 能找到class文件 但是class文件在序列化对象之后发生了修改 那么反序列化操作也会失败 抛出一个InvalidClassException异常 发生这个异常的原因:

  • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
  • 该类包含未知数据类型
  • 该类没有可访问的无参数构造方法

Serializable接口给需要序列化的类 提供了一个序列版本号 serialversionUID该版本号的目的在于验证序列化的对象和对应类是否版本匹配

原理图:

 

 

private static final long serialVersionUID=42L;

练习:序列化集合

1.将存有多个自定义对象的集合序列化操作 保存到list.txt文件中

2.反序列化list.txt 并遍历集合 打印对象信息

案例分析

1.把若干学生对象 保存到集合中

2.把集合序列化

3.反序列化读取时 只需要读取一次 转换为集合类型的

4.遍历集合 可以打印所有的学生信息

案例实现

代码:

复制代码
学生类:
public class Student implements Serializable {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student() {
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
测试类:
 public static void main(String[] args) throws IOException, ClassNotFoundException {
        Student zs = new Student("张三", 17);
        Student ls = new Student("李四", 16);
        Student ww = new Student("王五", 18);

        ArrayList<Student> list = new ArrayList<>();
        list.add(zs);
        list.add(ls);
        list.add(ww);

        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("E:\\file\\list.txt"));
        os.writeObject(list);
        os.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\file\\list.txt"));
        Object o = ois.readObject();
        ois.close();
        System.out.println(o);
    }
复制代码

运行结果:

posted @   baimingze  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示