晏 立,沈 銳
(紅河學(xué)院 工學(xué)院,云南 蒙自 661100)
Java序列化技術(shù)的探討
晏 立,沈 銳
(紅河學(xué)院 工學(xué)院,云南 蒙自 661100)
對象序列化是Java中的重要技術(shù),在RMI、AJAX、Web Service等方面都有應(yīng)用。文章介紹了幾種常用的Java序列化技術(shù),并通過比較、分析這些技術(shù)在功能、序列化后的字節(jié)數(shù)和序列化/反序列化速度方面的差異,得出了在什么應(yīng)用環(huán)境下應(yīng)如何選擇序列化技術(shù)框架。
Java; 序列化; XML; JSON
序列化就是一種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化.將對象狀態(tài)轉(zhuǎn)換成流之后,可以將其保存到文件、管道、另一進(jìn)程、通過網(wǎng)絡(luò)將對象發(fā)送到另一主機(jī),或發(fā)送到Web客戶端.對象序列化功能非常簡單、強(qiáng)大,在RMI、Socket、JMS、EJB、AJAX、Web Service都有應(yīng)用.
1、對象序列化可以實(shí)現(xiàn)分布式對象.主要應(yīng)用例如:RMI要利用對象序列化運(yùn)行遠(yuǎn)程主機(jī)上的服務(wù),就像在本地機(jī)上運(yùn)行對象時(shí)一樣.
2、java對象序列化不僅保留一個(gè)對象的數(shù)據(jù),而且遞歸保存對象引用的每個(gè)對象的數(shù)據(jù).可以將整個(gè)對象層次寫入字節(jié)流中,可以保存在文件中或在網(wǎng)絡(luò)連接上傳遞.利用對象序列化可以進(jìn)行對象的“深復(fù)制”,即復(fù)制對象本身及引用的對象本身.序列化一個(gè)對象可能得到整個(gè)對象序列.
Java 對象序列化是 JDK中引入的開創(chuàng)性特性之一,用于作為一種將 Java 對象的狀態(tài)轉(zhuǎn)換為字節(jié)數(shù)組,以便存儲或傳輸?shù)臋C(jī)制,以后,仍可以將字節(jié)數(shù)組轉(zhuǎn)換回 Java 對象原有的狀態(tài)[1].
使用Java的對象序列化方法比較簡單,只需要把實(shí)現(xiàn)Serializable接口,該對象就可以被序列化.序列化把對象轉(zhuǎn)換成一組byte,這樣日后要用這個(gè)對象時(shí)候,就能把這些byte數(shù)據(jù)恢復(fù)出來,并重新構(gòu)建原來的對象了.
近些年來,已經(jīng)有多個(gè) Java XML框架來簡化XML 文檔到 Java 對象圖的綁定過程.這些框架都提供了 XML 序列化和反序列化功能.這些框架封裝了XML 處理的全部工作,應(yīng)用程序代碼只需要處理普通的 Java 類.這些框架采用了兩種不同的方式:代碼生成和對象到 XML 映射.
2.2.1 代碼生成方式
使用代碼生成的框架有XMLBeans、JAXB、Zeus和 JBind等.這類框架首先要建立描述文檔數(shù)據(jù)類型的 XML方案,然后使用框架提供的工具,就可以生成與這些XML方案匹配的 Java 類.最后,用這些生成的類編寫應(yīng)用程序,并通過框架提供的API把數(shù)據(jù)序列化成 XML.這種類型的 XML 綁定框架在數(shù)據(jù)拆解時(shí)最有用(例如,使用 XML 文檔并把它們轉(zhuǎn)化成Java 對象).
代碼生成方式適用于應(yīng)用程序要使用大型 XML語法,這樣的好處是不再需要定義自己的 JavaBean.但框架生成的 Java 類不能編輯.如果修改了XML方案,生成的類也要重新生成.
2.2.2 映射方式
采用映射方式的框架包括 JAXB[3]、XStream[2]、Castor 和 Apache Commons Betwixt.映射通常是比代碼生成更靈活和更輕量的解決方案.首先,可以像通常一樣編寫 JavaBean,包括任何行為以及任何自己喜歡的方便的方法.然后,在運(yùn)行時(shí),調(diào)用框架中基于反射的工具,并根據(jù)對象成員的類型、名稱和值生成 XML 文檔.通過定義類的映射文件,或使用注釋自定義XML生成方式.
下面重點(diǎn)介紹JAXB和XStream:
(1)JAXB
JAXB(Java Architecture for XML Binding簡稱JAXB)允許Java開發(fā)人員將Java類映射為XML的框架.JAXB提供兩種主要特性:將一個(gè)Java對象序列化為XML,以及反向操作,將XML解析成Java對象.
當(dāng)XML格式復(fù)雜且經(jīng)常變化時(shí)JAXB特別有用.在這種情況下,經(jīng)常修改XML模式定義以與Java定義保持一致很花費(fèi)時(shí)間并且容易產(chǎn)生錯(cuò)誤,而使用JAXB這種一致是自動(dòng)完成的.
(2)XStream
XStream 是一個(gè)輕量級的、簡單易用的開放源代碼 Java 庫,用于將 Java 對象序列化為 XML 或反序列化[2].
使用 XStream 不用任何映射就能實(shí)現(xiàn)多數(shù) Java對象的序列化.在生成的 XML 中Java類名,變量名變成了元素名,對象中的值組成了 XML 中的元素內(nèi)容.使用 XStream 序列化的類不需要實(shí)現(xiàn) Serializable接口.XStream 是一種序列化工具而不是數(shù)據(jù)綁定工具,就是說不能從 XML 或者 XML Schema Definition(XSD) 文件生成類.和其他序列化工具相比,XStream有三個(gè)突出的特點(diǎn):
(1)XStream 不關(guān)心序列化/逆序列化的類的字段的可見性.
(2)序列化/逆序列化類的字段不需要 getter 和setter 方法.
(3)序列化/逆序列化的類不需要有默認(rèn)構(gòu)造函數(shù).
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式.易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成.它是基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個(gè)子集[4].JSON采用完全獨(dú)立于語言的文本格式,這使JSON成為理想的數(shù)據(jù)交換語言.
JSON建構(gòu)于兩種結(jié)構(gòu):
(1)“名稱/值”對的集合.不同的語言中,它被理解為對象(object),紀(jì)錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關(guān)聯(lián)數(shù)組(associative array).
(2)值的有序列表(An ordered list of values).在大部分語言中,它被理解為數(shù)組(array).
這些都是常見的數(shù)據(jù)結(jié)構(gòu).大部分現(xiàn)代計(jì)算機(jī)語言都支持它們.所以JSON可以用于不同的編程語言之間交換數(shù)據(jù),比較常見的就是在Web開發(fā)中Javascript和Java、C#間交互.
Protocol Buffers是Google提供的一個(gè)開源序列化框架[6],類似于XML,JSON這樣的數(shù)據(jù)表示語言,其最大的特點(diǎn)是基于二進(jìn)制,因此比傳統(tǒng)的XML表示高效短小得多.雖然是二進(jìn)制數(shù)據(jù)格式,但并沒有因此變得復(fù)雜,開發(fā)人員通過按照一定的語法定義結(jié)構(gòu)化的消息格式,然后使用工具自動(dòng)生成相關(guān)的類.protobuf可以支持java、c++、python等語言環(huán)境.
前面已經(jīng)介紹了把 Java 序列化的4種不同技術(shù).每種技術(shù)都有自己的優(yōu)勢和不足,分別適用于不同的應(yīng)用程序架構(gòu).下面從功能和效率上比較了這些序列化技術(shù).
硬件環(huán)境:CPU: Pentium T4300, RAM: 4G;
軟件環(huán)境:JDK 1.6.021
用于測試的類有兩個(gè)分別是:Person和PhoneNumber,類UML圖如圖1所示,功能比較的結(jié)果如表1所示.
圖1 測試類Person和PhoneNumber
表1 Java序列化功能比較
效率測試時(shí),每類測試執(zhí)行10組,每組共執(zhí)行序列化和反序列化操練100,000次,去掉最快和最慢的兩組,對剩下的8組取平均,結(jié)果如表2所示.
表2 Java序列化效率比較
前面的測試數(shù)據(jù)并不表明某項(xiàng)序列化技術(shù)比其他的技術(shù)好.畢竟不同標(biāo)準(zhǔn)的相對重要性取決于項(xiàng)目的具體情況.例如,如果要處理數(shù)百種數(shù)據(jù)類型,這時(shí)想要的是可伸縮性,那么使用JAXB或Protocol Buffers的代碼生成可能就是最好的選擇.如果處理的是小規(guī)模項(xiàng)目,想降低需要編寫的 JavaScript 代碼數(shù)量,那么JSON是比較好的選擇.如果要跨平臺交換數(shù)據(jù),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-),男,云南個(gè)舊人,工學(xué)碩士.研究方向:計(jì)算機(jī)網(wǎng)絡(luò)、P2P、軟件工程研究.
[責(zé)任編輯 張燦邦]