XStream介绍与使用
简介
- 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介绍与使用相关推荐
- Thoughtworks XStream介绍
Xsteam Intro XStream是thoughtworks开发的开源产品,采用的是xpp来进行xml和对象之间的转换.它不需要schema或其他的mapping文件就可以进行java对象和xm ...
- xstream操作xml
一.基本使用 (1)Xstream介绍 Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射 ...
- 常用 XML 解析技术
现在的软件项目都不是独立的一个项目,都是多系统协调工作.这样的话就涉及到系统间的通讯,通讯就会跟报文传输挂上关系.系统间使用怎样的报文格式进行通讯呢?有的使用固定长度格式报文:有的使用变长格式报文:有 ...
- Sophos XG Firewall SFOS 18.0 下载 百度网盘
作者:gc(at)sysin.org,主页:www.sysin.org 下载地址 请访问:https://sysin.org/article/DL-Sophos-SFOS-18/ 全球最佳可见性.防护 ...
- J2ee分布式框架--技术介绍文档
1. 项目核心代码结构截图 jeesz-utils jeesz-config jeesz-framework jeesz-core-cms jeesz-core-gen jeesz-core ...
- Java对象表示方式2:XStream实现对对象的XML化
前言 上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包 ...
- JEESZ分布式框架之技术介绍文档
摘要: Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码生成等.采 ...
- android 中XML和对象转换利器Xstream的使用
XStream框架: 虽说pull dom dom4j等优秀的xml解析工具使用非常广泛,但对于复杂庞大的数据交互来说,使用它们无疑让你倍加痛苦,你可能大部分精力都放在无聊繁琐的解析和拼装上,如果接口 ...
- JAVA Bean和XML之间的相互转换 - XStream简单入门
JAVA Bean和XML之间的相互转换 - XStream简单入门 背景介绍 XStream的简介 注解简介 应用实例 背景介绍 我们在工作中经常 遇到文件解析为数据或者数据转化为xml文件的情况, ...
最新文章
- Spring Boot thymeleaf模版支持,css,js等静态文件添加
- 你的微服务实践还顺利吗?
- grep+awk+sort+wc实战
- phpcms v9的url优化
- 游客显示的html代码,html5游客总数柱状图代码
- java里面怎么添加表约束_alter table添加表约束
- oracle 双层循环,oracle的双重for循环
- java查找目录文件函数_java 实现 文件操作工具集。包括文件、目录树的拷贝、删除、移动、查找等工具函数...
- [RMAN]数据库全部介质恢复
- java集合类程序代码_Java集合类源代码分析二:ArrayList(1)
- 持续集成 TeamCity 的配置与使用
- c语言上机作业题及答案,2017计算机二级C语言上机测试题附答案
- html嵌入百度地图无法显示
- Excel中纵向查找函数-VLOOKUP函数
- ug中模型不见了怎么办_UG双击prt文件却打不开模型是怎么回事?来看看解决方案吧...
- 一个功能简洁,使用简易的微信机器人
- 湖北省2019.3全国计算机等级考试,湖北2019年3月全国计算机等级考试报名系统
- iOS审核总被拒?腾讯教你提升iOS审核通过率!
- 多重比较示例:Bonferroni校正法和Benjamini Hochberg法
- 百度前端技术学院--零基础--第四天:背景边框列表链接和更复杂的选择器