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中序列化与反序列化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Learn Python the Hard Way

Learn Python the Hard Way

Zed A. Shaw / Addison-Wesley Professional / 2013-10-11 / USD 39.99

Master Python and become a programmer-even if you never thought you could! This breakthrough book and CD can help practically anyone get started in programming. It's called "The Hard Way," but it's re......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具