博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java对象表示方式2:XStream实现对对象的XML化
阅读量:6939 次
发布时间:2019-06-27

本文共 4869 字,大约阅读时间需要 16 分钟。

前言

上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象。总结一下这种对象表示方式的优缺点:

1、纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持

2、多语言环境下,使用Java序列化方式进行存储后,很难用其他语言还原出结果

3、占用的字节数比较大,而且序列化、反序列化效率也不高

前面也提到过,对象表示有各种各样的方式,序列化只是其中的一种而已。表示一个对象的目的无非就是为了对象<---->IO之间相互认识,至于怎么认识,那就有很多选择了。除了之前讲过的序列化,还可以选择将数据JSON化、XML化。当前也有比较好用的序列化工具,比如Google的protobuf。这篇文章主要想写一下对对象进行XML化,使用的是XStream。至于为什么选择写XStream,因为工作用,呵呵。

 

利用XStream表示一个对象

XStream就是一种Java对象和XML之间相互转换的工具,没有什么可以特别介绍的,XStream提供了所有的基础类型、数组、集合等类型直接转换的支持。XStream中的核心类就是XStream类,一般来说熟悉这个类就够用了。使用XStream需要用到两个第三方jar包,我工程里面使用的xstream-1.4.jarkxml2.jar。一开始我在玩XStream以为只需要前一个jar包就可以了,结果运行的时候各种错误,所以这里要注意一下。首先写一个最简单的程序:

1 public class XmlObject 2 { 3     private int       count; 4     private double    price; 5     private String    phone; 6      7     public XmlObject(int count, double price, String phone) 8     { 9         this.count = count;10         this.price = price;11         this.phone = phone;12     }13 14     public String toString()15     {16         return "count = " + count + ", price = " + price + ", phone = " + phone;17     }18 }
1 public static void main(String[] args)2 {3     XStream xs = new XStream();4     XmlObject xo = new XmlObject(10, 10.5, "110");5     String str = xs.toXML(xo);6     System.out.println(str);7 }

看一下运行结果:

10
10.5
110

是的,这么简单,就把一个对象表示出来了。这时候,想怎么操作这个str都无所谓了,可以用一个FileWriter把这个str存入磁盘,也可以用一个HttpClient传输这串str进行网络通信。

 

设置一下别名

OK,看到上面这串输出,可能有些人不爽了,“com.xrq.test.XmlObject”这么麻烦,能不能表示地简单点啊?当然可以,而且不仅可以对对象重命名,对象中的属性也可以:

1 public static void main(String[] args) 2 { 3     XStream xs = new XStream(); 4     XmlObject xo = new XmlObject(10, 10.5, "110"); 5     xs.alias("XmlObject", XmlObject.class); 6     xs.aliasField("Count", XmlObject.class, "count"); 7     xs.aliasField("Price", XmlObject.class, "price"); 8     xs.aliasField("Phone", XmlObject.class, "phone"); 9     String str = xs.toXML(xo);10     System.out.println(str);11 }

看一下运行结果:

10
10.5
110

看到,对象名变了,对象中的属性名也变化了。

 

XStream支持数组和集合

之前说过,XStream不仅支持基本数据类型,也支持数组、集合,把程序修改一下再看一下:

1 public class XmlObject 2 { 3     private int[]                 counts; 4     private List
phones; 5 private Map
calendar; 6 7 public XmlObject(int[] counts, List
phones, Map
calendar) 8 { 9 this.counts = counts;10 this.phones = phones;11 this.calendar = calendar;12 }13 14 public String toString()15 {16 return "count = " + counts + ", phones = " + phones + ", calendar = " + calendar;17 }18 }
1 public static void main(String[] args) 2 { 3     int[] counts = {10, 11, 12}; 4     List
phones = new ArrayList
(); 5 phones.add("110"); 6 phones.add("119"); 7 phones.add("120"); 8 Map
calendar = new HashMap
(); 9 calendar.put("1", new Date());10 calendar.put("2", new Date());11 XStream xs = new XStream();12 XmlObject xo = new XmlObject(counts, phones, calendar);13 xs.alias("XmlObject", XmlObject.class);14 xs.aliasField("Count", XmlObject.class, "counts");15 xs.aliasField("Phones", XmlObject.class, "phones");16 xs.aliasField("Calendar", XmlObject.class, "calendar");17 String str = xs.toXML(xo);18 System.out.println(str);19 }

看一下运行结果

10
11
12
110
119
120
2
2015-09-20 08:23:13.665 UTC
1
2015-09-20 08:23:13.665 UTC

看到string、date这两个开头字母都是小写的有点不爽?没关系,依样画葫芦,main函数里面加上这两句就可以了

xs.alias("String", String.class);xs.alias("Date", Date.class);

 

XML转换成Java对象

回归前面最简单的那个XmlObject,看一下把XML转换为Java对象,也很简单,利用fromXml()方法就可以了。自己构造一个xml字符串:

1 public static void main(String[] args)2 {3     XStream xs = new XStream();4     String xmlStr = "
10
10.5
110
";5 XmlObject xo = (XmlObject)xs.fromXML(xmlStr);6 System.out.println(xo);7 }

运行结果就不贴了,就是XmlObject三个属性的toString()而已。注意这里用的没有alias过的“com.xrq.test.XmlObject”,要是直接用“XmlObject”会报“com.thoughtworks.xstream.mapper.CannotResolveClassException”这个异常。解决方案很简单,第5行前面加上xs.alias("XmlObject", XmlObject.class);就好了。

 

后记

文章主要写了对于XStream的使用,一般来说,XStream用到这个程度也就够了。XStream使用非常容易,而且XML化之后的数据可读性强。不过在github上看到了一篇文章https://github.com/eishay/jvm-serializers/wiki,看得出XML的缺点主要在于还是解析的时候效率低了一些,而且为了可读性,XML也引入了一些冗余的文本信息从而造成了一定的空间开销。但是,无论如何,操作量不大的场景下 ,个人还是推荐使用XStream。

 

转载地址:http://xjfnl.baihongyu.com/

你可能感兴趣的文章
linux上安装配置vsftpd
查看>>
精至手机药典Windows Phone 7版
查看>>
非使用FindControl方法找到深层嵌套的控件 Ver2
查看>>
Android 开发学习笔记(二)—— Activity和Intent
查看>>
BZOJ 1915 [Usaco2010 Open]奶牛的跳格子游戏
查看>>
医生orm之count、where的若干问题
查看>>
SQL Note--Mirror
查看>>
12种编程语言类比12星座女【转载】
查看>>
asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
查看>>
MYSQL复制的几种模式
查看>>
《C标准库》((美)普劳格)【摘要 书评 试读】- 京东图书
查看>>
【JS基础回归】关于parseInt 与 numberObj.toString 中的“raidx”
查看>>
SVN如何check out单个文件
查看>>
Winsock IO模式
查看>>
Squid 代理服务器
查看>>
constellio——基于solr的开源搜索引擎系统源码研究(二)
查看>>
求反射向量
查看>>
CSS3 学习+实践(三)
查看>>
hadoop集群搭建
查看>>
基于UDP的IO多路复用一例
查看>>