前言

上一篇文章讲到了使用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 }

看一下运行结果:

<com.xrq.test.XmlObject><count>10</count><price>10.5</price><phone>110</phone>
</com.xrq.test.XmlObject>

是的,这么简单,就把一个对象表示出来了。这时候,想怎么操作这个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 }

看一下运行结果:

<XmlObject><Count>10</Count><Price>10.5</Price><Phone>110</Phone>
</XmlObject>

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

XStream支持数组和集合

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

 1 public class XmlObject
 2 {
 3     private int[]                 counts;
 4     private List<String>          phones;
 5     private Map<String, Date>     calendar;
 6
 7     public XmlObject(int[] counts, List<String> phones, Map<String, Date> 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<String> phones = new ArrayList<String>();
 5     phones.add("110");
 6     phones.add("119");
 7     phones.add("120");
 8     Map<String, Date> calendar = new HashMap<String, Date>();
 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 }

看一下运行结果

<XmlObject><Count><int>10</int><int>11</int><int>12</int></Count><Phones><string>110</string><string>119</string><string>120</string></Phones><Calendar><entry><string>2</string><date>2015-09-20 08:23:13.665 UTC</date></entry><entry><string>1</string><date>2015-09-20 08:23:13.665 UTC</date></entry></Calendar>
</XmlObject>

看到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 = "<com.xrq.test.XmlObject><count>10</count><price>10.5</price><phone>110</phone></com.xrq.test.XmlObject>";
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。

Java对象表示方式2:XStream实现对对象的XML化相关推荐

  1. 以对象的方式来访问xml数据表(二)

    为什么要以对象的方式来访问xml数据表? 还记得,自己是在一次完成师兄布置的任务时接触到了xml,那时候需要用xml来作为数据文件,保存一个简单的图书管理系统的数据.于是就知道了,可以用xml文件来保 ...

  2. redis对象保存方式?

    redis对象保存方式? 一.redis对象保存方式? 二.Redis数据淘汰机制 一.redis对象保存方式?   Json字符串: 需要把对象转换为json字符串,当做字符串处理.直接使用set ...

  3. java 对象创建过程_5种创建Java对象的方式

    在本篇文章中,将介绍5种创建Java对象的方式.类是创建对象的基本模板,接下来将介绍5种不同的方式,利用Java类来实例化Java对象. 1. 使用new关键字 ​ 采用new关键字实例化对象是Jav ...

  4. java 字节码对象_获得类的字节码对象的三种方式

    java源码(xxx.java)通过编译后形成字节码文件,字节码文件通过类加载器获得字节码对象, 通过字节码对象可以操作源码中的属性和方法. 方式一,使用类的class属性: Class clazz1 ...

  5. Java对象表示方式1:序列化、反序列化和 transient 关键字的作用

    前言快速到底 平时我们接触到的 Java 对象全都是在内存中的对象(它像磁盘中的一个个文件那样实实在在的存在着),所以它是无法进行 IO 操作或者网络通信的,因为在进行 IO 操作或者网络通信的时候, ...

  6. json对象,java对象,json字符串,java字符串转换方式,没写的自己去看源码!

    package com.sgai.property;import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjs ...

  7. JAVA实现 springMVC方式的微信接入、实现消息自动回复

    前段时间小忙了一阵,微信公众号的开发,从零开始看文档,踩了不少坑,也算是熬过来了,最近考虑做一些总结,方便以后再开发的时候回顾,也给正在做相关项目的同学做个参考. 思路 微信接入:用户消息和开发者需要 ...

  8. java对象的访问定位_2、JVM-Java对象的创建、对象结构、对象访问定位-Go语言中文社区...

    目录 记录下来方便个人学习复习 注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址定位对象在堆 ...

  9. java 图片传输方式_Java图像传输方法

    在研发B/S视频系统时候涉及到了图片在网络中的传输,研究了一些资料,也积累了部分经验: 一.序列化后传输 图像对象可以编码成指定图像格式文件保存在硬盘上,需要时再对其进行解码读入内存.但是除了这样还有 ...

最新文章

  1. 梯度优化算法Adam
  2. Oracle:ORA-12560和ORA-01031
  3. 皮一皮:确定不是某种特色酒店?
  4. [XA]转:一个关于结对编程(Pair Programming)的讲义
  5. JavaScript —— this、闭包、原型、异步
  6. 如何用 Blazor 实现 Ant Design 组件库?
  7. 区分关联、依赖和聚集关系
  8. chrome浏览器ios版本迎来“信用卡扫描器”代码
  9. Poj(3615),Floyd,最大值中的最小值
  10. 解释Linux进程的父子关系,Linux进程管理
  11. 少走弯路,给3~5年java程序员的唯一一条建议
  12. 使用navicat无法登陆oracle 数据库
  13. SQL Server2008数据库置疑修复办法
  14. 了解数据库索引及其原理
  15. 薛兆丰经济学讲义 简述
  16. Visual Studio介绍及安装
  17. 北京地铁站经纬度收集
  18. 应用中安装第三方apk的两种方法:利用Intent跳转安装页面、利用PackageInstaller静默安装
  19. MQTT Essentials(Basics(1-5) And Features(6-10))
  20. B - Ternary Logic

热门文章

  1. linux批量用户创建,linux 批量用户的创建
  2. c++ 11 锁_国民技术面向智能锁市场提供全系芯片与开源安全解决方案
  3. java使用eclipse打jar包_Eclipse对Java项目打Jar包
  4. android高德地图显示多点标记,高德地图多点标记自定义地图
  5. FPGA之道(68)原语的使用
  6. HDLBits 系列(41)根据仿真波形来设计电路之组合逻辑
  7. 【 Notes 】NLS ALGORITHMS of TOA - Based Positioning
  8. 安全无忧,函数计算推出访问用户VPC功能,实现自定义的多类VPC网络资源互通...
  9. HiSDP —— 高效的C++软件开发平台
  10. JavaScript 基础,登录验证