Java中序列化与反序列化

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

内容简介:在程序运行的过程中,所有的对象都是保存在内存中的,这意味着当程序运行结束的时候,操作系统会把分配给对象的内存全部回收。那有什么办法可以把对象存储起来?序列化就可以帮我们做到,序列化是将对象的状态信息转换成可取的格式的过程,可以存储为文件,或者透过网络发送数据时进行编码的过程,可以是字节或是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中序列化与反序列化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Web Data Mining

Web Data Mining

Bing Liu / Springer / 2011-6-26 / CAD 61.50

Web mining aims to discover useful information and knowledge from Web hyperlinks, page contents, and usage data. Although Web mining uses many conventional data mining techniques, it is not purely an ......一起来看看 《Web Data Mining》 这本书的介绍吧!

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

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具