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); }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本