Java序列化技术的探讨

2011-12-27 12:06立,沈
红河学院学报 2011年4期
关键词:代码生成序列化文档

晏 立,沈 锐

(红河学院 工学院,云南 蒙自 661100)

Java序列化技术的探讨

晏 立,沈 锐

(红河学院 工学院,云南 蒙自 661100)

对象序列化是Java中的重要技术,在RMI、AJAX、Web Service等方面都有应用。文章介绍了几种常用的Java序列化技术,并通过比较、分析这些技术在功能、序列化后的字节数和序列化/反序列化速度方面的差异,得出了在什么应用环境下应如何选择序列化技术框架。

Java; 序列化; XML; JSON

1 序列化概述

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.将对象状态转换成流之后,可以将其保存到文件、管道、另一进程、通过网络将对象发送到另一主机,或发送到Web客户端.对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB、AJAX、Web Service都有应用.

1、对象序列化可以实现分布式对象.主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样.

2、java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据.可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递.利用对象序列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身.序列化一个对象可能得到整个对象序列.

2 序列化方法介绍

2.1 Java对象序列化

Java 对象序列化是 JDK中引入的开创性特性之一,用于作为一种将 Java 对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回 Java 对象原有的状态[1].

使用Java的对象序列化方法比较简单,只需要把实现Serializable接口,该对象就可以被序列化.序列化把对象转换成一组byte,这样日后要用这个对象时候,就能把这些byte数据恢复出来,并重新构建原来的对象了.

2.2 XML

近些年来,已经有多个 Java XML框架来简化XML 文档到 Java 对象图的绑定过程.这些框架都提供了 XML 序列化和反序列化功能.这些框架封装了XML 处理的全部工作,应用程序代码只需要处理普通的 Java 类.这些框架采用了两种不同的方式:代码生成和对象到 XML 映射.

2.2.1 代码生成方式

使用代码生成的框架有XMLBeans、JAXB、Zeus和 JBind等.这类框架首先要建立描述文档数据类型的 XML方案,然后使用框架提供的工具,就可以生成与这些XML方案匹配的 Java 类.最后,用这些生成的类编写应用程序,并通过框架提供的API把数据序列化成 XML.这种类型的 XML 绑定框架在数据拆解时最有用(例如,使用 XML 文档并把它们转化成Java 对象).

代码生成方式适用于应用程序要使用大型 XML语法,这样的好处是不再需要定义自己的 JavaBean.但框架生成的 Java 类不能编辑.如果修改了XML方案,生成的类也要重新生成.

2.2.2 映射方式

采用映射方式的框架包括 JAXB[3]、XStream[2]、Castor 和 Apache Commons Betwixt.映射通常是比代码生成更灵活和更轻量的解决方案.首先,可以像通常一样编写 JavaBean,包括任何行为以及任何自己喜欢的方便的方法.然后,在运行时,调用框架中基于反射的工具,并根据对象成员的类型、名称和值生成 XML 文档.通过定义类的映射文件,或使用注释自定义XML生成方式.

下面重点介绍JAXB和XStream:

(1)JAXB

JAXB(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML的框架.JAXB提供两种主要特性:将一个Java对象序列化为XML,以及反向操作,将XML解析成Java对象.

当XML格式复杂且经常变化时JAXB特别有用.在这种情况下,经常修改XML模式定义以与Java定义保持一致很花费时间并且容易产生错误,而使用JAXB这种一致是自动完成的.

(2)XStream

XStream 是一个轻量级的、简单易用的开放源代码 Java 库,用于将 Java 对象序列化为 XML 或反序列化[2].

使用 XStream 不用任何映射就能实现多数 Java对象的序列化.在生成的 XML 中Java类名,变量名变成了元素名,对象中的值组成了 XML 中的元素内容.使用 XStream 序列化的类不需要实现 Serializable接口.XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition(XSD) 文件生成类.和其他序列化工具相比,XStream有三个突出的特点:

(1)XStream 不关心序列化/逆序列化的类的字段的可见性.

(2)序列化/逆序列化类的字段不需要 getter 和setter 方法.

(3)序列化/逆序列化的类不需要有默认构造函数.

2.3 JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.它是基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集[4].JSON采用完全独立于语言的文本格式,这使JSON成为理想的数据交换语言.

JSON建构于两种结构:

(1)“名称/值”对的集合.不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array).

(2)值的有序列表(An ordered list of values).在大部分语言中,它被理解为数组(array).

这些都是常见的数据结构.大部分现代计算机语言都支持它们.所以JSON可以用于不同的编程语言之间交换数据,比较常见的就是在Web开发中Javascript和Java、C#间交互.

2.4 Protocol Buffers

Protocol Buffers是Google提供的一个开源序列化框架[6],类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后使用工具自动生成相关的类.protobuf可以支持java、c++、python等语言环境.

3 比较序列化技术

前面已经介绍了把 Java 序列化的4种不同技术.每种技术都有自己的优势和不足,分别适用于不同的应用程序架构.下面从功能和效率上比较了这些序列化技术.

硬件环境:CPU: Pentium T4300, RAM: 4G;

软件环境:JDK 1.6.021

用于测试的类有两个分别是:Person和PhoneNumber,类UML图如图1所示,功能比较的结果如表1所示.

图1 测试类Person和PhoneNumber

表1 Java序列化功能比较

效率测试时,每类测试执行10组,每组共执行序列化和反序列化操练100,000次,去掉最快和最慢的两组,对剩下的8组取平均,结果如表2所示.

表2 Java序列化效率比较

4 结论

前面的测试数据并不表明某项序列化技术比其他的技术好.毕竟不同标准的相对重要性取决于项目的具体情况.例如,如果要处理数百种数据类型,这时想要的是可伸缩性,那么使用JAXB或Protocol Buffers的代码生成可能就是最好的选择.如果处理的是小规模项目,想降低需要编写的 JavaScript 代码数量,那么JSON是比较好的选择.如果要跨平台交换数据,XML或Protocol Buffers是比较好的选择,如果效率的要求比较高Protocol Buffers是最好的.

[1] JAVA API.http://java.sun.com/javase/6/docs/api/ 2010.

[2] XStream.http://xstream.codehaus.org/.

[3] JAXB.http://jaxb.java.net/.

[4] JSON.http://www.json.org/.

[5] Jackson.http://jackson.codehaus.org/.

[6] Protocol Buffers.http://code.google.com/apis/protocolbuffers/.

Java Serialization Technology

YAN Li SHEN Rui
(Engineering College, Honghe University, Mengzi 661100, China)

Object serialization is an important technology of Java, which is used in RMI, AJAX, Web Service, etc.This paper introduces several common techniques of Java serialization, by comparing and analyzing the differences of these techniques in function,space consumption after serialization, speed of serialization/deserialization, and getting how to choose the framework of serialization technology in what kind of application environment.

Java; serialization; XML; JSON

TP3

A

1008-9128(2011)04-0037-03

2011-05-02

晏立(1974-),男,云南个旧人,工学硕士.研究方向:计算机网络、P2P、软件工程研究.

[责任编辑 张灿邦]

猜你喜欢
代码生成序列化文档
浅谈Matlab与Word文档的应用接口
有人一声不吭向你扔了个文档
如何建构序列化阅读教学
Lustre语言可信代码生成器研究进展
基于RI码计算的Word复制文档鉴别
Java反序列化漏洞探析及其修复方法研究
代码生成技术在软件开发中的应用
Java 反序列化漏洞研究
Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat
基于XML的代码自动生成工具