Java中的序列化和反序列化
1|0Java中序列化和反序列化的区别
1|1序列化和反序列化的定义
序列化(Serialization)与反序列化(Deserialization)是编程中常见的两个概念,他们主要涉及到将数据结构或对象状态转换为可以存储或传输的格式,以及将存储或传输的格式转换回原始的数据结构或对象状态的过程。
这两个过程在数据持久化,网络通信,对象深拷贝等多个场景中发挥着重要作用。
1|2一.序列化(Serialization)
为什么需要序列化?
- 数据持久化:将对象状态保存到文件中,以便在程序关闭或系统重启后能够重新加载这些数据。
- 网络传输:在网络通信中,数据需要在客户端和服务端之间传输,序列化可以将对象转换成字节流,便于在网络中传输。
- 对象深拷贝:通过序列化一个对象,然后立即进行反序列化,可以实现对象的深拷贝。
1|3二.反序列化(Deserialization)
为什么需要反序列化?
- 数据恢复:在程序启动时,从文件中读取序列化后的数据,反序列化成对象,以恢复程序运行前的状态。
- 数据接收:在网络通信中,接收到的序列化数据需要被反序列化成对象,以便在本地系统中使用。
1|4三.Java的序列化
Java序列化是指将Java对象的状态转换为可以保存或传输的格式的过程。Java提供了多种序列化的方式,以满足不同的需求和场景。
1.实现Serialization接口:
- 特点:这是Java默认的序列化方式,通过实现java.io.Serialization接口来标记一个类可以被序列化。这种序列化是隐式的,会自动序列化所有非static和transient关键字修饰的成员变量。
- 使用场景:适用于大多数需要序列化的场景,特别是当对象的状态需要被持久化或在网络间传输时。
2.实现Externalizable接口:
- 特点:与Serialization接口类似,但Externalizable接口提供了更高的灵活性。实现该类接口的类必须手动实现writeExternal()和readExternal()方法,以控制序列化和反序列化的过程。
- 使用场景:适用于需要精确控制序列化过程的场景,比如只序列化对象的某些部分,或者需要对序列化数据进行加密等。
3.使用JSON序列化库:
- 常用库:如Jackson,Gson等。
- 特点:将对象转换为JSON格式的字符串进行序列化,可以跨语言,跨平台进行数据交换。JSON格式易于阅读和编写,也易于机器解析和生成。
- 使用场景:适用于需要与其它语言或系统交互的场景,或者当对象需要被存储为文本格式时。
4.使用XML序列化库:
- 常用库:如JAXN,XStream等。
- 特点:将对象序列化为二进制格式进行传输和存储,效率较高。这些库通常提供了丰富的数据结构和高效的编码解码算法。
- 使用场景:适用于对性能要求较高的场景,比如需要频繁序列化和反序列化大量数据的系统。
5.其他序列化方式:
- Hessian序列化:Hessian是一种通过网络传输和存储Java对象的二进制格式,可以跨语言,跨平台,效率较高。
- Kryo序列化:Kryo是一种高性能的Java序列化库,序列化和反序列化速度都很快,但只能用于Java环境。
Java提供了多种序列化方式,每种方式都有其特点和适用场景。在实际应用中,可以根据具体需求和场景选择合适的方式进行Java对象的序列化。需要注意的是,除了Java默认的序列化方式外,其他方式通常需要引入相应的第三方库。
1|5四.Java默认序列化与反序列化示例
我们先将一些Java的变量和一个Car对象序列化到 d盘的一个名为 data.dat 的文件中。
执行main方法后,会在d盘根目录下看到一个 data.dat的文件。
下面我们将这个文件反序列化至程序中并打印出来:
输出结果为:
Java序列化和反序列化注意事项:
- 读写顺序要一致。
- 序列化和反序列化对象要实现Serialization接口。
- 序列化中的类中,建议添加SerialVersionUID,为了提高版本的兼容性。
- 序列化对象时,默认将里面所有的属性都进行序列化,除了stati,transient修饰的成员。
- 序列化对象时,要求里面属性的类型也需要实现序列化接口。
- 序列化具备可继承性,也就是如果某类已经了序列化,则它的所有子类也默认实现了序列化。
1|6五.static 和 transient 在序列化中的区别
static关键字:
- 定义:static关键字用于修饰类的成员变量和方法,使其成为类变量或类方法,而不是实例变量或实例方法。类变量属于类本身,而非类的任何特定实例。
- 序列化行为:在序列化过程中,被static修饰的变量(即类变量)不会被序列化。这是因为static变量是类级别的,他们不属于任何特定的对象实例,而是由所有的实例共享。因此,序列化一个对象时,不会包含其类变量的值,因为类变量的值在JVM中是全局的,与特定的序列化实例无关。
- 反序列化影响:饭序列化一个对象时,被static修饰的变量会保持其在JVM中的当前值,而不是从序列化数据中恢复。这是因为静态变量是全局的,不受单个对象实例的序列化/反序列化过程影响。
Transient关键字:
- 定义:transient关键字用于修饰类的成员变量,以指示改变量在序列化时不应被序列化。
- 序列化行为:当一个对象被序列化时,所有非transient修饰的成员变量都会被序列化,而transient修饰的变量则会被忽略。这意味着,在序列化后的数据中,不会包含任何被transieent修饰的变量的值。
- 反序列化影响:在序列化过程中,被transient修饰的变量将不会被恢复其序列化前的值。相反,它们会被初始化位默认值(例如,数值类型的变量会被初始化为0或false,对象类型的变量会被初始化为null)。因此,开发者需要在反序列化后,根据需要手动为这些变量赋值。
关键字 | 定义 | 序列化行为 | 反序列化影响 |
---|---|---|---|
static | 修饰类变量或类方法,属于类本身 | 不被序列化 | 保持JVM中的当前值 |
transient | 修饰成员变量,指示在序列化时忽略该变量 | 被忽略,不被序列化 | 被初始化为默认值 |
__EOF__

本文作者:xxxx
本文链接:https://www.cnblogs.com/chenlei210162701002/p/18432401.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/chenlei210162701002/p/18432401.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具