java中的序列化
2021/5/24 14:24:51
本文主要是介绍java中的序列化,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
序列化
Java 的序列化就是将一个 Java 对象转化为一个字节流的一种机制。从字节流再转回 Java 对象叫做反序列化,是序列化的反向操作。
序列化和反序列化是和平台无关的,也就是说你可以在 Linux 系统序列化,然后在 Windows 操作系统做反序列化。
如果要序列化对象,需要使用 ObjectOutputStream 类的 writeObject() 方法。如果要做反序列化,则要使用 ObjectOutputStream 类的 readObject() 方法。
如下图所示,对象被转化为字节流后,被储存在了不同的介质中。这个流程就是序列化。在图的右边,也可以看到从不同的介质中,比如内存,获得字节流并转化为对象,这叫做反序列化。
为什么使用序列化
如果我们创建了一个 Java 对象,这个对象的状态在程序执行完毕或者退出后就消失了,不会得到保存。
所以,为了能解决这类问题,Java 提供了序列化机制。这样,我们就能把对象的状态做临时储存或者进行持久化,以供后续当我们需要这个对象时,可以通过反序列化把对象还原回来。
下面给出一些代码看看我们是怎么来做序列化的。
import java.io.Serializable; public class Player implements Serializable { private static final long serialVersionUID = 1L; private String serializeValueName; private transient String nonSerializeValuePos; public String getSerializeValueName() { return serializeValueName; } public void setSerializeValueName(String serializeValueName) { this.serializeValueName = serializeValueName; } public String getNonSerializeValueSalary() { return nonSerializeValuePos; } public void setNonSerializeValuePos(String nonSerializeValuePos) { this.nonSerializeValuePos = nonSerializeValuePos; } @Override public String toString() { return "Player [serializeValueName=" + serializeValueName + "]"; } }
import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class SerializingObject { public static void main(String[] args) { Player playerOutput = null; FileOutputStream fos = null; ObjectOutputStream oos = null; playerOutput = new Player(); playerOutput.setSerializeValueName("niubi"); playerOutput.setNonSerializeValuePos("x:1000,y:1000"); try { fos = new FileOutputStream("Player.ser"); oos = new ObjectOutputStream(fos); oos.writeObject(playerOutput); System.out.println("序列化数据被存放至Player.ser文件"); oos.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
Output:
序列化数据被存放至Player.ser文件
import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class DeSerializingObject { public static void main(String[] args) { Player playerInput = null; FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream("Player.ser"); ois = new ObjectInputStream(fis); playerInput = (Player) ois.readObject(); System.out.println("从Player.ser文件中恢复"); ois.close(); fis.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } System.out.println("player名字为 : " + playerInput.getSerializeValueName()); System.out.println("player位置为 : " + playerInput.getNonSerializeValuePos()); } }
Output:
从Player.ser文件中恢复 player名字为 : niubi player位置为 : null
关键特性
- 如果父类实现了 Serializable 接口那么子类就不必再实现 Serializable 接口了。但是反过来不行。
- 序列化只支持非 static 的成员变量
- static 修饰的变量和常量以及被 transient 修饰的变量是不会被序列化的。所以,如果我们不想要序列化某些非 static 的成员变量,直接用 transient 修饰它们就好了。
- 当反序列化对象的时候,是不会调用对象的构造函数的。
- 如果一个对象被一个要序列化的对象引用了,这个对象也会被序列化,并且这个对象也必须要实现 Serializable 接口。
这篇关于java中的序列化的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南