简介

  • XStream是Java类库,用来将对象序列化成XML (JSON)或反序列化为对象。XStream是自由软件,可以在BSD许可证的许可下分发。
  • XStream在运行时使用Java反射机制对要进行序列化的对象树的结构进行探索,并不需要对对象作出修改。XStream可以序列化内部字段,包括私private和final字段,并且支持非公开类以及内部类。
  • 在缺省情况下,XStream不需要配置映射关系,对象和字段将映射为同名XML元素。但是当对象和字段名与XML中的元素名不同时,XStream支持指定别名。XStream支持以方法调用的方式,或是Java 标注的方式指定别名。
  • XStream在进行数据类型转换时,使用系统缺省的类型转换器。同时,也支持用户自定义的类型转换器。

准备

pom依赖

<dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.19</version>
</dependency>

普通实体类

public class Person {private int id;private String name;private int age;private List<String> hobbies;private List<Person> family;public Person(int id, String name, int age, List<String> hobbies, List<Person> family) {this.id = id;this.name = name;this.age = age;this.hobbies = hobbies;this.family = family;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + ", hobbies=" + hobbies + ", family=" + family+ "]";}
}

对象转XML

最简单转换

List<String> hobbies = new ArrayList<>();
hobbies.add("play");
hobbies.add("learn");List<Person> list = new ArrayList<>();
Person brother = new Person(1, "哥哥", 22, hobbies, null);
Person sister = new Person(2, "妹妹", 17, null, null);
list.add(brother);
list.add(sister);Person p = new Person(3, "小明", 20, hobbies, list);XStream xs = new XStream();
String xml = xs.toXML(palias);
System.out.println(xml);

打印结果

<com.demo.test.Person><id>3</id><name>小明</name><age>20</age><hobbies><string>play</string><string>learn</string></hobbies><family><com.demo.test.Person><id>1</id><name>哥哥</name><age>22</age><hobbies reference="../../../hobbies"/></com.demo.test.Person><com.demo.test.Person><id>2</id><name>妹妹</name><age>17</age></com.demo.test.Person></family>
</com.demo.test.Person>

别名

  • 类别名 用 alias(String name, Class type) 方法
  • 类成员别名 用aliasField(String alias, Class definedIn, String fieldName)方法
  • 类成员作为属性别名 用useAttributeFor(Class definedIn, String fieldName)方法
...
XStream xs = new XStream();
xs.alias("person", Person.class);
xs.aliasField("code", Person.class, "id");
xs.useAttributeFor(Person.class, "id");
String xml = xs.toXML(p);
System.out.println(xml);

打印结果

<person code="3"><name>小明</name><age>20</age><hobbies><string>play</string><string>learn</string></hobbies><family><person code="1"><name>哥哥</name><age>22</age><hobbies reference="../../../hobbies"/></person><person code="2"><name>妹妹</name><age>17</age></person></family>
</person>

转换器

xml中hobbies元素标签使用 string元素标签表意不明,修改如下

 XStream xs = new XStream();xs.alias("person", Person.class);xs.aliasField("code", Person.class, "id");xs.useAttributeFor(Person.class, "id");ClassAliasingMapper classAliasingMapper = new ClassAliasingMapper(xs.getMapper());classAliasingMapper.addClassAlias("hobby", String.class);xs.registerLocalConverter(Person.class, "hobbies", new CollectionConverter(classAliasingMapper));String xml = xs.toXML(p);System.out.println(xml);

打印结果

<person code="3"><name>小明</name><age>20</age><hobbies><hobby>play</hobby><hobby>learn</hobby></hobbies><family><person code="1"><name>哥哥</name><age>22</age><hobbies reference="../../../hobbies"/></person><person code="2"><name>妹妹</name><age>17</age></person></family>
</person>

使用注解

  • 别名注解,使用注解 @XStreamAlias
  • 属性注解, @XStreamAsAttribute
  • 注解生效,使用autodetectAnnotations(boolean mode)方法

别名实体类

@XStreamAlias("person")
public class PersonAlias {@XStreamAlias("code")@XStreamAsAttributeprivate int id;@XStreamAlias("name")private String name;@XStreamAlias("age")private int age;@XStreamAlias("hobbies")private List<String> hobbies;@XStreamAlias("family")private List<PersonAlias> family;public PersonAlias(int id, String name, int age, List<String> hobbies, List<PersonAlias> family) {this.id = id;this.name = name;this.age = age;this.hobbies = hobbies;this.family = family;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + ", hobbies=" + hobbies + ", family=" + family+ "]";}
}
XStream xs = new XStream();
xs.autodetectAnnotations(true);
ClassAliasingMapper classAliasingMapper = new ClassAliasingMapper(xs.getMapper());
classAliasingMapper.addClassAlias("hobby", String.class);
xs.registerLocalConverter(PersonAlias.class, "hobbies", new CollectionConverter(classAliasingMapper));
String xml = xs.toXML(palias);
System.out.println(xml);

打印结果

<person code="3"><name>小明</name><age>20</age><hobbies><hobby>play</hobby><hobby>learn</hobby></hobbies><family><person code="1"><name>哥哥</name><age>22</age><hobbies reference="../../../hobbies"/></person><person code="2"><name>妹妹</name><age>17</age></person></family>
</person>

XML转对象

  • 需要别名设置
  • 需要转换器设置
  • 需要allowTypes ,解决com.thoughtworks.xstream.security.ForbiddenClassException问题
 String xml = "<person code=\"3\"><name>小明</name><age>20</age><hobbies><hobby>play</hobby><hobby>learn</hobby></hobbies><family><person code=\"1\"><name>哥哥</name><age>22</age><hobbies reference=\"../../../hobbies\"/></person><person code=\"2\"><name>妹妹</name><age>17</age></person></family></person>";XStream xs = new XStream();xs.alias("person", Person.class);xs.aliasField("code", Person.class, "id");xs.useAttributeFor(Person.class, "id");ClassAliasingMapper classAliasingMapper = new ClassAliasingMapper(xs.getMapper());classAliasingMapper.addClassAlias("hobby", String.class);xs.registerLocalConverter(Person.class, "hobbies", new CollectionConverter(classAliasingMapper));xs.allowTypes(new Class[] { Person.class });Person toPerson = (Person) xs.fromXML(xml);System.out.println(toPerson);

打印结果

Person [id=3, name=小明, age=20, hobbies=[play, learn], family=[Person [id=1, name=哥哥, age=22, hobbies=[play, learn], family=null], Person [id=2, name=妹妹, age=17, hobbies=null, family=null]]]

对象与JSON互转

引入JSON依赖

<dependency><groupId>org.codehaus.jettison</groupId><artifactId>jettison</artifactId><version>1.4.1</version>
</dependency>
XStream xs = new XStream(new JettisonMappedXmlDriver());
xs.alias("person", Person.class);
xs.aliasField("code", Person.class, "id");
xs.useAttributeFor(Person.class, "id");
ClassAliasingMapper classAliasingMapper = new ClassAliasingMapper(xs.getMapper());
classAliasingMapper.addClassAlias("hobby", String.class);
xs.registerLocalConverter(Person.class, "hobbies", new CollectionConverter(classAliasingMapper));
String jsonStr = xs.toXML(p);
System.out.println(jsonStr);
xs.allowTypes(new Class[] { Person.class });
Person toPerson = (Person) xs.fromXML(jsonStr);
System.out.println(toPerson);

打印结果

{"person":{"@code":3,"name":"小明","age":20,"hobbies":[{"hobby":["play","learn"]}],"family":[{"person":[{"@code":1,"name":"哥哥","age":22,"hobbies":[{"@reference":"../../../hobbies"}]},{"@code":2,"name":"妹妹","age":17}]}]}}
Person [id=3, name=小明, age=20, hobbies=[play, learn], family=[Person [id=1, name=哥哥, age=22, hobbies=[play, learn], family=null], Person [id=2, name=妹妹, age=17, hobbies=null, family=null]]]

注意事项

  • 特殊符号
    处理下划线
    new XStream(new XppDriver(new XmlFriendlyNameCoder("-", "")))
    都不转义
    new XStream(new XppDriver(new NoNameCoder()))

  • XML转Java对象,元素标签不存在Java类中报错

class XStreamEx extends XStream {@Overrideprotected MapperWrapper wrapMapper(MapperWrapper next) {return new MapperWrapper(next) {@Overridepublic boolean shouldSerializeMember(@SuppressWarnings("rawtypes") Class definedIn, String fieldName) {if (definedIn == Object.class) {return false;}return super.shouldSerializeMember(definedIn, fieldName);}};}
}

参考

百度百科XStream

XStream介绍与使用相关推荐

  1. Thoughtworks XStream介绍

    Xsteam Intro XStream是thoughtworks开发的开源产品,采用的是xpp来进行xml和对象之间的转换.它不需要schema或其他的mapping文件就可以进行java对象和xm ...

  2. xstream操作xml

    一.基本使用 (1)Xstream介绍 Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射 ...

  3. 常用 XML 解析技术

    现在的软件项目都不是独立的一个项目,都是多系统协调工作.这样的话就涉及到系统间的通讯,通讯就会跟报文传输挂上关系.系统间使用怎样的报文格式进行通讯呢?有的使用固定长度格式报文:有的使用变长格式报文:有 ...

  4. Sophos XG Firewall SFOS 18.0 下载 百度网盘

    作者:gc(at)sysin.org,主页:www.sysin.org 下载地址 请访问:https://sysin.org/article/DL-Sophos-SFOS-18/ 全球最佳可见性.防护 ...

  5. J2ee分布式框架--技术介绍文档

    1.      项目核心代码结构截图 jeesz-utils jeesz-config jeesz-framework jeesz-core-cms jeesz-core-gen jeesz-core ...

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

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

  7. JEESZ分布式框架之技术介绍文档

    摘要: Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码生成等.采 ...

  8. android 中XML和对象转换利器Xstream的使用

    XStream框架: 虽说pull dom dom4j等优秀的xml解析工具使用非常广泛,但对于复杂庞大的数据交互来说,使用它们无疑让你倍加痛苦,你可能大部分精力都放在无聊繁琐的解析和拼装上,如果接口 ...

  9. JAVA Bean和XML之间的相互转换 - XStream简单入门

    JAVA Bean和XML之间的相互转换 - XStream简单入门 背景介绍 XStream的简介 注解简介 应用实例 背景介绍 我们在工作中经常 遇到文件解析为数据或者数据转化为xml文件的情况, ...

最新文章

  1. Spring Boot thymeleaf模版支持,css,js等静态文件添加
  2. 你的微服务实践还顺利吗?
  3. grep+awk+sort+wc实战
  4. phpcms v9的url优化
  5. 游客显示的html代码,html5游客总数柱状图代码
  6. java里面怎么添加表约束_alter table添加表约束
  7. oracle 双层循环,oracle的双重for循环
  8. java查找目录文件函数_java 实现 文件操作工具集。包括文件、目录树的拷贝、删除、移动、查找等工具函数...
  9. [RMAN]数据库全部介质恢复
  10. java集合类程序代码_Java集合类源代码分析二:ArrayList(1)
  11. 持续集成 TeamCity 的配置与使用
  12. c语言上机作业题及答案,2017计算机二级C语言上机测试题附答案
  13. html嵌入百度地图无法显示
  14. Excel中纵向查找函数-VLOOKUP函数
  15. ug中模型不见了怎么办_UG双击prt文件却打不开模型是怎么回事?来看看解决方案吧...
  16. 一个功能简洁,使用简易的微信机器人
  17. 湖北省2019.3全国计算机等级考试,湖北2019年3月全国计算机等级考试报名系统
  18. iOS审核总被拒?腾讯教你提升iOS审核通过率!
  19. 多重比较示例:Bonferroni校正法和Benjamini Hochberg法
  20. 百度前端技术学院--零基础--第四天:背景边框列表链接和更复杂的选择器

热门文章

  1. mysql 网络,MySQL :: MySQL 网络研讨会
  2. 【嵌入式Linux应用开发】温湿度监控系统——绘制温湿度折线图
  3. 剖析Android移动开发程序员的职业发展之路
  4. python获取期货数据_股票超过压力位
  5. valine评论系统使用
  6. 编程初学者为什么要首选Java?
  7. 无法连接到服务器的错误解决方案
  8. 真实机器人dobot magician调试经验
  9. 软件工程(一)------软件生存周期
  10. gre vim linux,OVS搭建GRE隧道和VXLAN