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

  1. Java对象表示方式2:XStream实现对对象的XML化

    上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持 ...

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

    平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...

  3. JAVA对象实例化方式总结

    JAVA对象实例化的方法 New对象实例 // 直接new对象实例 Productor productor = new Productor(); 反射机制 Java反射机制是在运行状态中,对于任意一个 ...

  4. Java对象表示方式1:序列化、反序列化的作用

    1.序列化是的作用和用途 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存 ...

  5. Java 对象拷贝方式

    (1)BeanUtils.cloneBean()使用: http://www.cnblogs.com/fervour/archive/2009/12/18/1627868.html package c ...

  6. java对象与xml相互转换 ---- xstream

    XStream是一个Java对象和XML相互转换的工具,很好很强大.提供了所有的基础类型.数组.集合等类型直接转换的支持. XStream中的核心类就是XStream类,一般来说,熟悉这个类基本就够用 ...

  7. 使用XStream注解实现Java对象与XML互相转换的代码示例

    本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例.    我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件.如:jdom.dom4j等 ...

  8. 使用XStream是实现XML与Java对象的转换(6)--持久化

    九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...

  9. java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式

    反射: JAVA语言的反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调 ...

随机推荐

  1. A. Vasya and Football

    A. Vasya and Football time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  2. SSH私用私钥登陆

    1.导入私钥,将私钥文件放到当前登陆用户目录下的.ssh目录下 2.指定私钥登陆,ssh -i .ssh/ssh_rsa  root@target.com 如果出现了下面这种情况 这是因为私钥文件权限 ...

  3. Linux系统常用命令权威指南

    <一>线上查询及帮助命令(2)1.man man [选项] [命令] 查看命令帮助,命令的词典,更复杂的还有info,但不常用. #man cd-a 显示所有的手册页,不只是显示第一个-f ...

  4. [国嵌攻略][090][linux网络编程模型]

    编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型

  5. POJ 1426 Find The Multiple(数论——中国同余定理)

    题目链接: http://poj.org/problem?id=1426 Description Given a positive integer n, write a program to find ...

  6. vim&vi在编辑的时候突然卡死,不接收输入问题的解决

    多方查找无果,看了官方解释如下: "CTRL-S and CTRL-Q are called flow-control characters. They represent an antiq ...

  7. Bootstrap中data-src无法显示图片,但是src可以

    在学习bootstrap时,书中的源码是用的data-src来定义图像位置,但是我在使用的时候无法显示图片:data-src可以在img标签中使用来显示图片吗?我使用src可以,而是用data-src ...

  8. 手机WebApp是什么?

    手机WebApp是基于HTML5+css3开发的,一次开发,可以兼容许多的平台(android/iphone),调用本地功能(比如照相),可以用phonegap去实现,所以,是一个趋势.相比每个平台定 ...

  9. CCF系列之门禁系统(201412-1)

    试题编号:201412-1试题名称:门禁系统时间限制: 2.0s内存限制: 256.0MB 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每位读者有一个编号,每条记录用读者的 ...

  10. CentOS 7安装Tomcat8

    一.安装环境 tomcat的安装依赖于Java JDK,需要先安装配置正确的JDK http://www.cnblogs.com/VoiceOfDreams/p/8376978.html 二.安装包准 ...