当前位置: 首页 > news >正文

JavaSE——IO流5:高级流(序列化与反序列化流/对象操作流)

目录

一、序列化流/对象操作输出流——ObjectOutputStream

二、反序列化流/对象操作输入流——ObjecInputStream

三、序列化流和反序列化流使用细节

1.Serializable接口

2.序列化后的文件不可修改

3.serialVersionUID

4.transient修饰的不能被序列化

四、用对象流读写多个对象


序列化流            ObjectOutputStream        OutputStream

反序列化流        ObjecInputStream             InputStream

一、序列化流/对象操作输出流——ObjectOutputStream

序列化流可以把Java对象写到本地文件中 

注意:使用对象输出流将对象保存到文件时会出现NotSerializableException异常。所以输出的对象必须实现Serializable接口。 

代码示例:

public class ObjectStreamDemo1 {public static void main(String[] args) throws IOException {// 需求:利用序列化流/对象操作输出流,把一个对象写到本地文件中// 1.创建对象Student student = new Student("张三", 25);// 2.创建序列化流的对象/对象操作输出流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\a.txt"));// 3.写出数据oos.writeObject(student);// 4.释放资源oos.close();}
}/*** Serializable接口里面是没有抽象方法,标记型接口* 一旦实现了这个接口,就表示当前的Student类可以被序列化* 理解:一个物品的合格证*/
class Student implements Serializable {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

运行结果:

二、反序列化流/对象操作输入流——ObjecInputStream

可以把序列化到本地文件中的对象,读取到程序中来

代码实现: 

public class ObjectStreamDemo2 {public static void main(String[] args) throws IOException, ClassNotFoundException {// 1.创建反序列化流的对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\a.txt"));// 2.读取数据Object readObject = ois.readObject();// Student readObject = (Student)ois.readObject();  // 可以强转// 3.打印对象System.out.println(readObject);// Student{name='张三', age=25}// 4.释放资源ois.close();}
}

三、序列化流和反序列化流使用细节

1.Serializable接口

        使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常。

2.序列化后的文件不可修改

        序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。

修改序列化后的文件:

再次执行反序列化代码:

会抛出StreamCorruptedException异常

3.serialVersionUID

当对象被序列化到本地文件后,如果继续修改类,反序列化会失败,原因是版本号不一样,需要将IDEA设置serialVersionUID

Student类就会生成一个版本号,修改Student类也能反序列化成功 

 

如果不定义serialVersionUID,会抛出InvalidClassException异常

注意:版本号要最后定义,即在类定义完成后再定义版本号,因为版本号是根据当前类的成员生成的。

4.transient修饰的不能被序列化

        如果一个对象中的某个成员变量的值不向北序列化,就需要给该成员变量添加transient关键字修饰,该关键字标记的成员变量不参与序列化过程。

四、用对象流读写多个对象

public class ObjectStreamDemo3 {public static void main(String[] args) throws IOException, ClassNotFoundException {System.out.println("----------------序列化---------------");ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\b.txt"));ArrayList<Teacher> list = new ArrayList<>();list.add(new Teacher("zhangsan", 23, "南京"));list.add(new Teacher("lisi", 24, "北京"));list.add(new Teacher("wangwu", 26, "重庆"));oos.writeObject(list);oos.close();System.out.println("----------------反序列化---------------");ObjectInputStream ois = new ObjectInputStream(new FileInputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\b.txt"));ArrayList<Teacher> teachers = (ArrayList<Teacher>) ois.readObject();for (Teacher teacher : teachers) {System.out.println(teacher);}/*** Teacher{name='zhangsan', age=23, address='南京'}* Teacher{name='lisi', age=24, address='北京'}* Teacher{name='wangwu', age=26, address='重庆'}*/ois.close();}
}class Teacher implements Serializable {private static final long serialVersionUID = 6030696901056953191L;private String name;private int age;private String address;public Teacher(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';}
}

http://www.mrgr.cn/news/56721.html

相关文章:

  • C# 迭代器 分部类
  • 市场洞察:看机会的底层逻辑
  • 浅谈人工智能之基于阿里云使用vllm搭建Llama3
  • Acti数据集:首个全面手动标注的汽车网络安全威胁情报语料库,包含908份真实报告,涵盖3678个句子、8195个安全实体和4852个语义关系。
  • torch.nn.functional模块介绍
  • 推荐一款风扇控制软件:Fan Control
  • C++与现代开发实践第二课:C++标准库(STL)深入
  • 【C#】不需要连接数据库使用 ADO.NET 实现数据绑定
  • 人工智能--数学基础
  • AIGC文本生成3D模型
  • 模型的参数化和非参数化是什么?
  • 常见的css选择器汇总
  • 管家婆ERP集成用友好业财(管家婆主供应链)
  • 机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用
  • HBuilderX离线打包Android
  • 会话管理——Cookie
  • vue常用的修饰符作用与使用场景总结
  • 云上大数据架构是什么?
  • 已集成工作流引擎的低代码平台(源码获取,JAVA,Vue)
  • WPF LiveChart控件基础属性介绍