Java中序列化与反序列化

栏目: Java · 发布时间: 5年前

内容简介:在程序运行的过程中,所有的对象都是保存在内存中的,这意味着当程序运行结束的时候,操作系统会把分配给对象的内存全部回收。那有什么办法可以把对象存储起来?序列化就可以帮我们做到,序列化是将对象的状态信息转换成可取的格式的过程,可以存储为文件,或者透过网络发送数据时进行编码的过程,可以是字节或是XML等格式。其相反的过程就被称为反序列化。

在程序运行的过程中,所有的对象都是保存在内存中的,这意味着当程序运行结束的时候,操作系统会把分配给对象的内存全部回收。

那有什么办法可以把对象存储起来?

序列化就可以帮我们做到,序列化是将对象的状态信息转换成可取的格式的过程,可以存储为文件,或者透过网络发送数据时进行编码的过程,可以是字节或是XML等格式。其相反的过程就被称为反序列化。

Java中准备了 SerializableExternalizable 两个接口(需要序列化的类必须实现这两个接口其一),和 ObjectOutputStreamObjectInputStream 两个类来帮助开发者实现序列化与反序列化。

Serializable Code

只需在需要序列化的类上实现 Serializable 接口,即可通过 ObjectOutputStream 实现序列化到文件系统中。

Java中序列化与反序列化

输出结果为 Person{name='MrXieXie', age=null, password='null'}

注意:序列化到文件后,将 password 的值重置为 null

可以看出在 Serializable ,静态变量还有被 transient 标注的变量不会被序列化。

那么是不是所有的静态变量和被 transient 标注的变量就不会被序列化呢?让我们来看一下 Externalizable 接口。

Externalizable Code

使用 Externalizable 实现序列化要比 Serializable 复杂一丢丢,需要实现 writeExternalreadExternal 方法,这两个方法会在序列化和反序列化时调用。

需要注意的是,该接口需要调用被序列化类的无参构造器,若不提供则会抛出异常 java.io.InvalidClassException: cn.mrxiexie.serializable.Car; no valid constructor

Java中序列化与反序列化

输出结果为 Car{name='MrXieXie', brand='MrXieXie', price=1234567.89}

注意:序列化到文件后,将 price 的值重置为 null

可以看出即使是静态变量和被 transient 标注的变量还是会被序列化。原因很简单, Serializable 接口是自动序列化,当发现有 transient 标注的变量时则不序列化该变量,而 Externalizable 接口则是需要在 writeExternal 方法中指定需要序列化的变量。


以上所述就是小编给大家介绍的《Java中序列化与反序列化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

安全测试指南(第4版)

安全测试指南(第4版)

OWASP基金会 / 电子工业出版社 / 2016-7-1 / CNY 89.00

软件安全问题也许是这个时代面临的*为重要的技术挑战。Web应用程序让业务、社交等网络活动飞速发展,这同时也加剧了它们对软件安全的要求。我们急需建立一个强大的方法来编写和保护我们的互联网、Web应用程序和数据,并基于工程和科学的原则,用一致的、可重复的和定义的方法来测试软件安全问题。本书正是实现这个目标的重要一步,作为一本安全测试指南,详细讲解了Web应用测试的“4W1H”,即“什么是测试”、“为什......一起来看看 《安全测试指南(第4版)》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换