java之对象的序列化
对象的序列化与反序列化
序列化为将对象的信息存储到文件中,反序列化为将文件存储的对象信息读取出来。
ObjectOutputStream(对象序列化)
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。
如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。只能将支持 java.io.Serializable 接口的对象写入流中。
每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。
ObjectInputStream(对象反序列化)
ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。
代码演示
首先创建一个实体类实现Serializable接口,该接口只是一个序列化的标记接口。
class Person implements Serializable {
private String name;
private int id;
public Person() {
}
public Person(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}}
然后实现序列化和反序列化的代码。
*** 在程序目录下创建一个temp.properties文件*/
File dirPath = new File(".");
//创建一个储存文件temp.properties文件的绝对路径
String filePath = dirPath.getCanonicalPath() + "\\src\\temp.properties";
//创建一个序列化对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
//这里需要序列化对象,所以使用writeObject方法
oos.writeObject(new Person("张三",1));//写入第一个对象
oos.writeObject(new Person("李四",2));//写入第二个对象
oos.writeObject(new Person("王五",3));//写入第三个对象//关闭资源
oos.close();
//创建一个反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
Person p1 = (Person) ois.readObject();//读取第一个对象
Person p2 = (Person) ois.readObject();//读取第二个对象
Person p3 = (Person) ois.readObject();//读取第三个对象
//关闭资源
ois.close();
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
结果:
Person{name='张三', id=1}Person{name='李四', id=2}Person{name='王五', id=3}
集合存取:
/**
* 在程序目录下创建一个temp.properties文件
*/
File dirPath = new File(".");
//创建一个储存文件temp.properties文件的绝对路径
String filePath = dirPath.getCanonicalPath() + "\\src\\temp.properties";
//要存储的数据集合
List<Person> writeList = new ArrayList<>();
writeList.add(new Person("张三",1));
writeList.add(new Person("李四",2));
writeList.add(new Person("王五",3));
//创建一个序列化对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
//这里需要序列化对象,所以使用writeObject方法
oos.writeObject(writeList);
//关闭资源
oos.close();
//创建一个反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
List<Person> readList = (List<Person>) ois.readObject();
//关闭资源
ois.close();
//遍历集合
Iterator<Person> iterator = readList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());}
//结果:
Person{name='张三', id=1}Person{name='李四', id=2}Person{name='王五', id=3}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)