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使用相关推荐

  1. java xstream jar_Java库使用----xstream1.3.1

    package com.xstream; import java.util.Map; /** * XStream可以自动生成相关的xml配置 */ public class XstreamTest { ...

  2. Java XStream理解

    XStream是一个Java对象和XML相互转换的工具,很好很强大.提供了所有的基础类型.数组.集合等类型直接转换的支持.因此XML常用于数据交换.对象序列化(这种序列化和Java对象的序列化技术有着 ...

  3. java XStream更新

    漏洞详情 XStream 是一个常用的 Java 对象和 XML 相互转换的工具.近日 XStream 官方发布安全更新,修复了高危和严重漏洞如下: Version 1.4.17 CVE-2021-3 ...

  4. 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)

    用 XStream 序列化/反序列化 XML 为 Java 对象(实例) Posted on 2007-06-05 19:06 Stephen Wong 阅读(1224) 评论(0)  编辑 收藏 网 ...

  5. java 反序列化工具 marshalsec改造 加入dubbo-hessian2 exploit

    0x00 前言 1. 描述 官方github描述: Java Unmarshaller Security - Turning your data into code execution "将 ...

  6. SpringBoot XStream整合

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

  7. JAVA代码审计中危险函数

    JAVA代码审计中危险函数 xxe: javax.xml.parsers.DocumentBuilder   (原生dom解析xml) 例子: DocumentBuilderFactory doc=D ...

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

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

  9. java xml添加节点_Java对XML节点的修改、添加、删除 –By Xstream框架

    在J2EE.Java项目中对xml操作是一项非常常见的事情,在我认识了XStream以后,才彻底明白XML模型对象的概念,使用XStream让我XML的设计不由自主更符合OO的风格.另外,除了在设计上 ...

最新文章

  1. 巧用CSS的Wave滤镜
  2. 前后端分离的探索(四)
  3. 2014新跟踪算法KCF笔记
  4. 11.context_suggester
  5. OpenOffice java api UNO 设置属性总结
  6. Redis 命令行工具有趣的罕见用法
  7. 高质量linux c编程指南,《linux c编程指南》学习手记5
  8. 容器技术Docker K8s 1 云原生技术概述
  9. matlab pn码捕获,基于PMF_FFT的PN码捕获方法及性能
  10. 删除非系统盘的msdia80.dll文件以及出现的dllregisterserver调用失败错误代码0x80004005问题
  11. Unity3D音频系统Aduio声音丨音乐控制丨音频播放丨音频暂停丨音频控制
  12. php怎么分栏,word文档怎么设置分栏格式
  13. 短除法对一个数分解质因数
  14. AI插画设计,用AI制作一个只可爱的短腿柯基插画
  15. 关于把秒换算成分钟和小时的c程序
  16. Chemdraw —— SMILES与二维结构之间的互相转换
  17. 关于显示webpack不是内部或外部命令问题的解决方法
  18. Python3.x爬虫教程:爬网页、爬图片、自动登录
  19. 用递归方法将十进制转化为二进制数
  20. 智联招聘职位信息爬取并写入xls表中

热门文章

  1. We should: Good Good Study, Day Day Up
  2. 工作站和台式机的区别是什么
  3. CVPR2022 目标检测方向文章(附摘要)
  4. 微信小程序-欢迎界面
  5. 啊,CET6----六级高频词2
  6. Ubuntu18.04安装evo及简单使用方法
  7. 青岛企业掘金大数据时代 大数据时代已经来临
  8. 推荐10本EEG领域值得阅读的书籍
  9. 一文读懂「用户行为数据」的采集、分析和应用
  10. 开始连载长篇小说《星辰傀儡线》