Java --- Xstream使用
Java --- Xstream
Xstream提供了Java对象和XML格式, JSON格式转换的支持。
Xml支持
基本使用
简单实用示例
TestBean tb = new TestBean(); tb.setId(1L); tb.setAge(20); tb.setUserName("张三"); XStream xStream = new XStream(); String xmlStr = xStream.toXML(tb); System.out.println(xmlStr); TestBean tb2 = (TestBean) xStream.fromXML(xmlStr); System.out.println(tb2.getId()); System.out.println(tb2.getAge()); System.out.println(tb2.getUserName()); |
TestBean: protectedlongId; protected String userName; protectedintage; |
<com.lh.example.xstream.TestBean> <Id>1</Id> <userName>张三</userName> <age>20</age> </com.lh.example.xstream.TestBean> 1 20 张三 |
从示例中可见不用做任何的配置就可以简单获取Xstream对象来进行XML和Java对象的互相转换。从输出看到xml的根节点是类的完整类名,而节点名称是域名。
如果我们想要定义自己的节点名称可以使用Xstream类的aliasXXX方法:
alias(String, Class)
aliasType(String, Class)
alias(String, Class, Class)
aliasPackage(String, String)
aliasField(String, Class, String)
aliasAttribute(String, String)
aliasSystemAttribute(String, String)
aliasAttribute(Class, String, String)
比如:
XStream xStream = new XStream(); xStream.aliasType("User", TestBean.class); xStream.aliasField("用户名", TestBean.class, "userName");; |
<User> <Id>1</Id> <用户名>张三</用户名> <age>20</age> </User> |
List,Map,Array,Instance 域:
上面例子显示了String和简单类型生成的xml格式,下面展示下List, Map, Array, 类实例的xml格式
protected List<String> friendNames; protected String[] shcools; protected Property property; protected Map<String, String> testMap; |
<User> <Id>1</Id> <用户名>张三</用户名> <age>20</age> <friendNames> <string>person a</string> <string>person b</string> <string>person c</string> </friendNames> <shcools> <string>A SCHOOL</string> <string>B SCHOOL</string> </shcools> <property> <name>watch</name> <value>1000</value> </property> <testMap> <entry> <string>keyA</string> <string>ValueA</string> </entry> <entry> <string>keyB</string> <string>ValueB</string> </entry> </testMap> </User> |
忽略某个属性
xStream.omitField(TestBean.class, "age"); |
Converter
通过添加类型转换定制对特定类型的值是如何输出的。
下面是java.util.Date类型的默认输出:
<date>2015-10-14 07:06:08.162 UTC</date>
我们可以通过添加该类型的转换器,将其输出格式改变为:20151014150000.
实现方法为实现com.thoughtworks.xstream.converters.Converter或 SingleValueConverter接口,并注册到需要使用到该转换器的类型上Xstream提供了所有很多抽象基类类帮助我们简化对转换器的编写的编写,我们将使用到类AbstractSingleValueConverter。
publicclass DateConverter extends AbstractSingleValueConverter{ publicfinal SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmmss"); @Override publicboolean canConvert(Class arg0) { returnarg0.equals(Date.class); } @Override public Object fromString(String arg0) { try { returnsdf.parse(arg0); } catch (ParseException e) { e.printStackTrace(); } returnnull; } public String toString(Object object){ returnsdf.format((Date)object); } } |
注册: xStream.registerConverter(new DateConverter()); |
输出: <date>20151014 152633</date> |
注解支持
一种替换通过xStream设置大量别名的方法是使用注解。注解包括:
com.thoughtworks.xstream.annotations.XStreamAlias.class
com.thoughtworks.xstream.annotations.XStreamAliasType.class
com.thoughtworks.xstream.annotations.XStreamAsAttribute.class
com.thoughtworks.xstream.annotations.XStreamContainedType.class
com.thoughtworks.xstream.annotations.XStreamConverter.class
com.thoughtworks.xstream.annotations.XStreamConverters.class
com.thoughtworks.xstream.annotations.XStreamImplicit.class
com.thoughtworks.xstream.annotations.XStreamImplicitCollection.class
com.thoughtworks.xstream.annotations.XStreamInclude.class
com.thoughtworks.xstream.annotations.XStreamOmitField.class
使用示例:
@XStreamAlias("用户") publicclass TestBean { @XStreamOmitField protectedlongId; protected String userName; @XStreamAsAttribute protectedintage; @XStreamConverter(DateConverter.class) protected Date date; @XStreamImplicit protected List<String> friendNames; |
XStream xStream = new XStream(); xStream.autodetectAnnotations(true); |
Json
前面提到,Xstream也至此Json。其实现依赖Jettison。
XStream xStream = new XStream(new JettisonMappedXmlDriver()); |
{"用户":{"@age":"20","userName":"张三","date":"20151016 150028","string":["person a","person b","person c","A SCHOOL","B SCHOOL"]},"property":{"name":"watch","value":1000},"testMap":{"entry":[{"string":["keyA","ValueA"]},{"string":["keyB","ValueB"]}]}} |
Xstream只是装饰器
从Json的支持中可以看出和xml在API的使用上没有任何的区别,只是指定了一个JettitionMappedXmlDriver。
Xstream并不仅仅一个具体的XML,JSON工具,从Xstream的源码中可以查看出Xstream
其实是一个Java 类序列化的通用框架,具体的序列化实现则是可以使用不同的第三方实现,如Dom4j, Jdom,当然也就要使用引用第三方的Jar包,比如Json的使用。
在创建Xstream实例时通过提供一个HierarchicalStreamDriver来对流进行不同的处理。
com.thoughtworks.xstream.io.HierarchicalStreamDriver
com.thoughtworks.xstream.io.HierarchicalStreamDriver.createReader(Reader)
com.thoughtworks.xstream.io.HierarchicalStreamDriver.createReader(InputStream)
com.thoughtworks.xstream.io.HierarchicalStreamDriver.createReader(URL)
com.thoughtworks.xstream.io.HierarchicalStreamDriver.createReader(File)
com.thoughtworks.xstream.io.HierarchicalStreamDriver.createWriter(Writer)
com.thoughtworks.xstream.io.HierarchicalStreamDriver.createWriter(OutputStream)
从方法列表中可以看出,HierarchicalStreamDriver其实是流的Reader和Writer的创建工厂。
Dom4JDriver |
使用Dom4j SAXReader方式来解析XML,使用Dom4j提供的XMLWriter类 |
DomDriver |
使用JDK xml api |
Jdom |
使用JDOM |
XomDriver |
使用Xom对象模型 |
BEAStaxDriver |
使用BEA Stax实现 |
StandardStaxDriver |
使用JDK的 STAX实现 |
WstxDriver |
使用Woodstox STAX实现。 |
KXml2Driver |
使用KXML2解析器 |
Xpp3Driver |
使用Xpp3解析器 |
XppDriver |
使用Xpp解析器 |
KXml2DomDriver |
使用KMX2的XPP DOM解析器 |
Xpp3DomDriver |
使用Xpp3的 XPP DOM解析器 |
XppDomDriver |
使用Xpp的XPP DOM解析器 |
Jdom2Driver |
使用JDOM2 |
JettisonMapppedXmlDriver |
使用Jettison进行Json操作 |
JsonHierachicalStreamDriver |
Xstream自带的一个JSON操作工具,有更优化的Json格式,但是不支持去序列化 |
BinaryStreamDriver |
Xstream自带的针对二进制流的序列化和反序列化工具。文档中标准了没有Java序列化紧凑 |
Xstream默认使用XppDriver.
注2:XPP XML FULL PARSER
注1:@引用1
XL的API无外乎是以下两种:
基于树的API- 整个文档以树的形式被读入内存,可以被调用程序随机访问。
基于事件的API - 应用注册接收事件,当原XML文档遇到事体时就会产生这些事件。
两者皆有优点,前者(例如DOM)允许对文档进行随机访问,而后者(例如SAX)需要较小的内存开销,并却通常更快。
这两个方法可以认为是正好相反。基于树的API允许无限制的,随机的访问和操纵,而基于事件的API是一次性地遍历源文档。
StAX被设计为这两者的一个折中。在StAX中,程序的切入点是表示XML文档中一个位置的光标。应用程序在需要时向前移动光标,从解析器拉出信息。与基于事件的API(如SAX)将“数据推送”给应用程序不同的是,SAX需要应用程序维持时间间的状态,以保持文档内的位置信息。
Xstream不能做什么
从Xstream的API可以看出,XSTREAM专注的是对象和序列化结果的转换,其是建立在各种各样的xml解析器和类反射机制,或则注解的基础上的,本质是一个装饰器。
适配的结果是统一,简单的API,那相对于直接使用xml解析器,它不能做的就是任何操作待编辑额
@引用1:引用自百度百科 STAX
Java --- Xstream使用相关推荐
- java xstream jar_Java库使用----xstream1.3.1
package com.xstream; import java.util.Map; /** * XStream可以自动生成相关的xml配置 */ public class XstreamTest { ...
- Java XStream理解
XStream是一个Java对象和XML相互转换的工具,很好很强大.提供了所有的基础类型.数组.集合等类型直接转换的支持.因此XML常用于数据交换.对象序列化(这种序列化和Java对象的序列化技术有着 ...
- java XStream更新
漏洞详情 XStream 是一个常用的 Java 对象和 XML 相互转换的工具.近日 XStream 官方发布安全更新,修复了高危和严重漏洞如下: Version 1.4.17 CVE-2021-3 ...
- 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)
用 XStream 序列化/反序列化 XML 为 Java 对象(实例) Posted on 2007-06-05 19:06 Stephen Wong 阅读(1224) 评论(0) 编辑 收藏 网 ...
- java 反序列化工具 marshalsec改造 加入dubbo-hessian2 exploit
0x00 前言 1. 描述 官方github描述: Java Unmarshaller Security - Turning your data into code execution "将 ...
- SpringBoot XStream整合
XStream使用 XStream简介 Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射 ...
- JAVA代码审计中危险函数
JAVA代码审计中危险函数 xxe: javax.xml.parsers.DocumentBuilder (原生dom解析xml) 例子: DocumentBuilderFactory doc=D ...
- Java对象表示方式2:XStream实现对对象的XML化
前言 上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包 ...
- java xml添加节点_Java对XML节点的修改、添加、删除 –By Xstream框架
在J2EE.Java项目中对xml操作是一项非常常见的事情,在我认识了XStream以后,才彻底明白XML模型对象的概念,使用XStream让我XML的设计不由自主更符合OO的风格.另外,除了在设计上 ...
最新文章
- 巧用CSS的Wave滤镜
- 前后端分离的探索(四)
- 2014新跟踪算法KCF笔记
- 11.context_suggester
- OpenOffice java api UNO 设置属性总结
- Redis 命令行工具有趣的罕见用法
- 高质量linux c编程指南,《linux c编程指南》学习手记5
- 容器技术Docker K8s 1 云原生技术概述
- matlab pn码捕获,基于PMF_FFT的PN码捕获方法及性能
- 删除非系统盘的msdia80.dll文件以及出现的dllregisterserver调用失败错误代码0x80004005问题
- Unity3D音频系统Aduio声音丨音乐控制丨音频播放丨音频暂停丨音频控制
- php怎么分栏,word文档怎么设置分栏格式
- 短除法对一个数分解质因数
- AI插画设计,用AI制作一个只可爱的短腿柯基插画
- 关于把秒换算成分钟和小时的c程序
- Chemdraw —— SMILES与二维结构之间的互相转换
- 关于显示webpack不是内部或外部命令问题的解决方法
- Python3.x爬虫教程:爬网页、爬图片、自动登录
- 用递归方法将十进制转化为二进制数
- 智联招聘职位信息爬取并写入xls表中