对象流 ObjectInputStream ObjectOutputStream
【1】对象流
ObjectOutputStream
ObjectInputStream
用于存储和读取基本数据类型或对象的处理流
他的强大之处就是可以把java中的对象写入到数据流中,也能把对象从数据源中还原回来
【2】序列化和反序列化
ObjectOutputStream类:把内存中的java对象转换成平台无关的二进制数据,从而允许把这种二进制数据持久地保存在硬盘上,或通过
网络将这种二进制数据传输到另一个网络节点。----》序列化
用ObjectOutputStream类:当其它程序获取了这种二进制数据,就可以恢复成原来的java对象。---》反序列化
代码:
首先将一个字符串对象写到文件当中去:---》序列化
package com.msb.io04; import java.io.*; /** * @author : liu * 日期:09:18:05 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Test01 { //这是一个main方法:是程序的入口 public static void main(String[] args) throws IOException { //将内存中的字符串写出到文件中去: ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("d:\\test1.txt"))); //将内存中的字符串写出到文件中: oos.writeObject("你好"); //关闭流 oos.close(); } }
查看文件:
我们看不懂文件的内容,但是程序是可以看懂的,所以可以写一个程序读文件中内容---》反序列化
package com.msb.io04; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; /** * @author : liu * 日期:09:22:41 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Test02 { //这是一个main方法:是程序的入口 public static void main(String[] args) throws IOException, ClassNotFoundException { //将文件中保存的字符串读入到内存中来 ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("d:\\test1.txt"))); //Object o = ois.readObject(); String s = (String) ois.readObject();//在这里我们知道读取的是一个String类型的对象流可以直接转换位String类型 System.out.println(s); //关闭流 System.out.println(ois); } }
控制台
【4】代码:操作自定义类的对象
自定义的Person类
package com.msb.io05; /** * @author : liu * 日期:09:31:00 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Person { private String name; private int age; 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; } public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } }
测试类
package com.msb.io05; import java.io.*; /** * @author : liu * 日期:09:32:56 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Test01 { //这是一个main方法:是程序的入口 public static void main(String[] args) throws IOException { //序列化:将内存中对象----》文件 ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("d:\\test.txt"))); //创建一个对象 Person lili = new Person("lili", 19); oos.writeObject(lili); oos.close(); } }
运行的时候发现异常
出现异常的原因是:
你想要序列化的那个对象对应的类必须要实现要一个接口
接口内部,什么都没有,这种 接口叫标识接口。
起到表示作用,标识是什么呢?只要实现这个接口的类的对象才能序列化,否则不可以。
解决办法:将Person实现标识接口就可以
测试:发现序列化成功,Person具备了序列化的能力
这个二进制文件我们看不懂,但是程序能看懂,所以我们可以用程序实现 反序列化操作;
将这个对象恢复到内存中
package com.msb.io05; import java.io.*; /** * @author : liu * 日期:09:53:06 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Test02 { //这是一个main方法:是程序的入口 public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("d:\\test.txt"))); Person p = (Person)ois.readObject(); System.out.println(p); ois.close(); } }
结果:
因为我们没有重写toString方法,所以结果位
证明了反序列化成功了:将二进制数据读入到内存中来
我现在在Person类中加入ToString方法
package com.msb.io05; import java.io.Serializable; /** * @author : liu * 日期:09:31:00 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Person implements Serializable { private String name; private int age; 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; } public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
再次运行测试类:
出现异常:
出现异常的原因:
解决:给这个类加入一个序列号:serialvEersionUID
【6】idea中配置序列化设置 2021.3版本
在Person类上:alt+enter
【7】序列化细节
(1)被序列化的类的内部所有属性,必须是可序列化的(基本数据类型都是可序列化的)
(2)static transient修饰的属性不可以被序列化
transient可以修饰一些用于被保护的数据像密码类的数据,这样就不会被反序列化得到
package com.msb.io05; import java.io.Serializable; /** * @author : liu * 日期:09:31:00 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Person implements Serializable { private static final long serialVersionUID = -474097987956658159L; private transient String name; private static int age; private Famaily f=new Famaily(); 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; } public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", f=" + f +",age="+age+ '}'; } }
结果
【推荐】国内首个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搭建本