xstream简介(bean与xml转换工具)
本文
解决了"_"显示为"__"的问题。
解决了当xml的element属性多余bean的映射问题
解决了生成xml换行的问题
作用:
能够简单的通过
xstreamInstance.fromXML(xmlContent); 获取到对象
xstreamInstance.toXML(beanInstance); 将对象转换为xml
官网:
http://xstream.codehaus.org/
适用场景
bean与xml存在相互转换的场景:配置文件读取,报文解析,生成报文
从官方的版本演进上看,还提供了hibernate,json配置文件的读取。从1.4版本以后,新加入hibernate相关处理的逻辑,该部分功能尚未详细了解。
不适用场景
xml文件较大(比如有个10M的xml文件解析,就不太适用,因一次性解析,以及生成对象将会造成内存溢出)
效率
经过实测对象10个属性,对应xml。
xstream采用默认xml引擎,效率是dom4j解析的10倍左右(具体效率与代码实现有关,dom4j也能实现较高性能的解析)
总体来说,利用xstream能够大大提高,xml解析的入门,以及编写方便
具体事例:
如何应用:
从xstream的pom文件分析
只需要将xstream.jar xpp3.jar xmlpull.jar放入项目即可
如果为maven项目
只需要添加:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.3</version>
</dependency>
使用实例:
例子一:
定义类
public class Person {
private String firstname;
private String lastname;
private PhoneNumber phone;
private PhoneNumber fax;
// ... constructors and methods
}
public class PhoneNumber {
private int code;
private String number;
// ... constructors and methods
}
初始化解析对象
XStream xstream = new XStream();
如果不想使用xpp作为xml解析引擎,也可写为new XStream(new Dom4jDriver());
设置映射规则:
xstream.alias("person", Person.class);
xstream.alias("phonenumber", PhoneNumber.class);
将对象序列化为xml
Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));
String xml = xstream.toXML(joe);
结果:
<person>
<firstname>Joe</firstname>
<lastname>Walnes</lastname>
<phone>
<code>123</code>
<number>1234-456</number>
</phone>
<fax>
<code>123</code>
<number>9999-999</number>
</fax>
</person>
由xml生成对象
Person newJoe = (Person)xstream.fromXML(xml);
当然xstream也支持注解,一下代码中使用到了 XstreamUtils 这个是在xstream基础上的封装,解决了现在xstream在日常使用中会出现的一些问题
@XStreamAlias("TestBeanRoot")
class TestBean
{
private String testEl1;
@XStreamAlias("test_Rename_El2")
private String testEl2;
@XStreamAsAttribute
private String testAttr;
@XStreamOmitField
private String testSkip;
@XStreamImplicit(itemFieldName = "itemName", keyFieldName = "keyName")
private List<String> testList;
...getAndSet
}
XStream testBeanXstream = XstreamUtils.getXstream(XstreamUtilsTest.TestBean.class);
XstreamUtilsTest.TestBean tt = createTestBean();
System.out.println(testBeanXstream.toXML(tt));
"<TestBeanRoot testAttr=\"attr\">"
"<testEl1>el1</testEl1>"
+ "<test_Rename_El2>el2</test_Rename_El2>"
+ "<itemName>listItem1</itemName>"
+ "<itemName>listItem2</itemName>"
+ "</TestBeanRoot>"
如果存在多级el的情况,可以通过引用其他类的形式 如 private TestBean2 testBean2;,新的类内部又可以具有其他结构
xstream常用的注解有:
@XStreamAlias
@XStreamAsAttribute
@XStreamOmitField
@XStreamImplicit
但看到很多文章,有这样的说法
1、xstream有bug,在转换过程中,会将 定义别名中的下划线“_”转换为xml后会变成“__”
2、在xml生成对象时,xml有多出来的元素时,对象生成将会抛出异常。
事实上从xstream源代码分析,这两个都不是问题,xstream都提供了对应的处理方式
具体参看工具类
/**
* xstream工具封装
* 用以处理xml与bean的转换
*
* @author PengQingyang
* @version [版本号, 2012-10-5]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class XstreamUtils
{
private static Logger logger = LoggerFactory.getLogger(XstreamUtils.class);
private static Map<Class<?>, XStream> xstreamMap = new WeakHashMap<Class<?>, XStream>();
/**
* 转换过程中特殊字符转码
*/
private static NameCoder nameCoder = new NameCoder()
{
public String encodeNode(String arg0)
{
return arg0;
}
public String encodeAttribute(String arg0)
{
return arg0;
}
public String decodeNode(String arg0)
{
return arg0;
}
public String decodeAttribute(String arg0)
{
return arg0;
}
};
/**
* 在xml中多余的节点生成bean时会抛出异常
* 通过该mapperWrapper跳过不存在的属性
* @param mapper
* @return [参数说明]
*
* @return MapperWrapper [返回类型说明]
* @exception throws [异常类型] [异常说明]
* @see [类、类#方法、类#成员]
*/
private static MapperWrapper createSkipOverElementMapperWrapper(
Mapper mapper)
{
MapperWrapper resMapper = new MapperWrapper(mapper)
{
/**
* @param elementName
* @return
*/
@SuppressWarnings("rawtypes")
@Override
public Class realClass(String elementName)
{
Class res = null;
;
try
{
res = super.realClass(elementName);
}
catch (CannotResolveClassException e)
{
logger.warn("xstream change xml to object. filed (0) not exsit. ",
elementName);
}
return res;
}
};
return resMapper;
}
/**
* 获取xstream转换对象
* @param classType
* @return [参数说明]
*
* @return XStream [返回类型说明]
* @exception throws [异常类型] [异常说明]
* @see [类、类#方法、类#成员]
*/
public static XStream getXstream(Class<?> classType)
{
return getXstream(classType, true);
}
/**
* 获取xstream转换对象
* @param classType
* @param isSkipOverElement
* @return [参数说明]
*
* @return XStream [返回类型说明]
* @exception throws [异常类型] [异常说明]
* @see [类、类#方法、类#成员]
*/
public static XStream getXstream(Class<?> classType,
boolean isSkipOverElement)
{
if (xstreamMap.containsKey(classType))
{
return xstreamMap.get(classType);
}
XStream res = null;
if (isSkipOverElement)
{
res = new XStream(new Xpp3DomDriver(nameCoder))
{
/**
* @param next
* @return
*/
protected MapperWrapper wrapMapper(MapperWrapper next)
{
return createSkipOverElementMapperWrapper(next);
}
};
}
else
{
res = new XStream(new Xpp3DomDriver(nameCoder));
}
logger.info("create xstream by {0} , parameter {1}", new Object[] {
classType.getName(), isSkipOverElement });
res.processAnnotations(classType);
xstreamMap.put(classType, res);
return res;
}
}
封装后的使用:
private static xxxxXstream = XstreamUtils.getXstream(Xxxx.class);
method(){
xxxxXstream.toXML
xxxxXstream.fromXML
}
2012-10-22追加
如果想生成的xml是否换行,自己进行控制,可这样写
/**
*<获取xstream转换对象>
*<功能详细描述>
* @param classType
* @param isSkipOverElement
* @param isNewLine
* @return [参数说明]
*
* @return XStream [返回类型说明]
* @exception throws [异常类型] [异常说明]
* @see [类、类#方法、类#成员]
*/
public static XStream getXstream(Class<?> classType,
boolean isSkipOverElement, boolean isNewLine) {
if (xstreamMap.containsKey(classType)) {
return xstreamMap.get(classType);
}
/**
* 生成domDriver 重写createWriter方法,使生成的domDriver在新的节点不会信生成一行
*/
HierarchicalStreamDriver domDriver = null;
if (isNewLine) {
domDriver = new Xpp3DomDriver(nameCoder);
} else {
domDriver = new Xpp3DomDriver(nameCoder) {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out, getNameCoder()) {
protected String getNewLine() {
return "";
}
};
}
};
}
XStream res = null;
if (isSkipOverElement) {
res = new XStream(domDriver) {
protected MapperWrapper wrapMapper(MapperWrapper next) {
return createSkipOverElementMapperWrapper(next);
}
};
} else {
res = new XStream(domDriver);
}
logger.info("create xstream by {0} , parameter {1}", new Object[] {
classType.getName(), isSkipOverElement });
res.processAnnotations(classType);
xstreamMap.put(classType, res);
return res;
}
分享到:
相关推荐
**使用XStream进行Bean到XML转换的步骤:** 1. **引入库**:首先,你需要在项目中引入XStream库,这可以通过添加对应的jar文件(如xstream-1.3.1.jar)或者在Maven或Gradle等构建工具中配置依赖完成。 2. **创建...
这个工具类的目标就是利用xStream的功能,方便地将XML文档转换为Java Bean对象,以及将Bean对象转换为XML字符串。 xStream的核心思想是通过反射和类型映射来实现对象与XML之间的转换。它使用一种称为“annoation”...
**XStream:JavaBean与XML/JSON之间的转换大师** XStream是一个开源库,它为Java对象提供了简单且直观的XML序列化和反序列化的解决方案。它不仅能够将Java对象转换成XML,反之亦然,还能支持JSON格式的转换。这个...
XStream不仅能够将Java对象转换为XML,还可以反向将XML转换回Java对象,极大地简化了对象与XML之间的序列化和反序列化过程。 XStream库是由Johannes Lehtinen创建的一个开源项目,它是基于Java的,可以处理复杂的...
XStream是Java中一个流行的数据绑定库,它能够将Java对象序列化为XML,反之亦然,极大地简化了Java对象与XML之间的转换。XMLPull是轻量级的API,用于解析XML文档,它允许开发者以事件驱动的方式处理XML流,而无需...
总的来说,XStream是一个强大的工具,它使得Java对象与XML之间的转换变得简单易行。通过理解和掌握XStream的使用,开发者能够更高效地处理数据序列化问题,提高代码的可维护性和可扩展性。如果你在实际项目中遇到...
XStream 是一个强大的 Java 库,它允许程序员以一种简单直观的方式将 Java 对象序列化为 XML,同时也可以从 XML 文档反序列化回 ...在项目中使用 xstream-1.3.1.jar,可以轻松实现 Java 对象与 XML 文档之间的转换。
### XML转换为Bean XStream也可以反序列化XML字符串回Java对象。以下是相应的代码: ```java String xml = "<user><name>John</name><age>30</age></user>"; User user = (User) xstream.fromXML(xml); ``` 在这里...
总结一下,XStream是一个功能强大的工具,能够轻松地在XML与JavaBean之间进行转换,适用于需要在不同系统间传递数据或保存对象状态的场景。在MyEclipse这样的集成开发环境中,导入XStream库后,开发者可以快速上手,...
总之,"Converter between XML and Java Bean"涉及的关键知识点是利用如XStream这样的库实现XML与Java对象之间的转换,这在Java开发中是非常重要且实用的技能,尤其在处理数据交换、持久化存储和跨系统通信时。...
// 实现将XML转换为指定类型的Bean } public static String toXML(Object obj) { // 实现将Java对象转换为XML字符串 } } ``` 这个工具对于需要频繁在XML和Java对象之间转换的项目非常有用,比如在Web服务或者...
《XStream 1.4.3:Java Bean到XML与JSON转换的秘密武器》 XStream,这个小巧而强大的库,自版本1.4.3以来,一直是Java开发者处理对象序列化和反序列化的首选工具。它以其简洁的API、高效的性能和对多种格式的支持...
3. 第三方库:除了标准的Java库,还有许多第三方库如Apache's Digester、Castor和XStream等,它们提供了更简洁的API来简化XML与JavaBean之间的转换。 4. XMLBeans库:压缩包中的"xmlbean"可能指的是Apache的...
XStream是一款强大的Java库,主要用于XML序列化和反序列化,它使得XML数据与Java对象之间的转换变得简单直观。在“XStream_1.3.chm”这个压缩包中,包含了一个详细的帮助文档(通常CHM是Microsoft的HTML Help格式,...
描述中提到的"xstream-distribution-1.4.7-bin"确认了这是一个完整的发行包,包含了将Java Bean对象转换为XML,以及从XML恢复为Java Bean的功能,同时也支持Jason(可能是JSON)的数据转换。 XStream的核心功能在于...
2. JSON到XML转换: - Jackson库同样提供了反向转换功能,使用`writeValueAsString`方法将JSON对象转换成XML字符串。 - 使用JsonXML Java库:这个库专门用于JSON到XML的转换,提供了简单易用的API。 - Google的...
XStream支持直接与Java Bean的属性对应,简化映射过程。 6. **JSON支持**: 除了XML,XStream还提供了对JSON的支持,只需添加相应的转换器即可。 ### 四、最佳实践 1. **避免默认类型转换**: 尽量避免使用...
对于XML转换,Jackson有一个名为`JAXB`的模块,可以处理XML与Java对象之间的转换。 3. **JAXB (Java Architecture for XML Binding)** JAXB是Java SE的一部分,用于将Java对象绑定到XML。它支持XML到JavaBean的...
总之,`XStream`是Java开发中处理对象与XML之间转换的强大工具,它的灵活性和易用性使其成为数据交换和序列化的理想选择。正确理解和使用别名配置以及自定义转换器,可以让开发者更好地掌控XML数据的表示和解析过程...
- **XMLEncoder**是最基础的实现,适合简单的XML转换,但缺乏灵活性。 - **Apache Commons BeanUtils**提供了更多自定义选项,但可能需要额外的配置和代码。 - **XStream**是功能最全面的库,支持高级映射和定制,...