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}

posted @   幻影黑子  阅读(182)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示