XStream是一个序列化对象为XML或XML转换为对象的库.  

特点:  
简化的API; 
无映射文件; 
高性能,低内存占用; 
整洁的XML; 
不需要修改对象;支持内部私有字段,不需要setter/getter方法,final字段;非公有类,内部类;类不需要默认构造器,完全对象图支持.维护对象引用计数,循环引用. i 
提供序列化接口; 
自定义转换类型策略; 
详细的错误诊断; 
快速输出格式;当前支持 JSON 和 morphing.

使用场景  
Transport      转换 
Persistence    持久化对象 
Configuration  配置 
Unit Tests     单元测试

限制

enhanced 模式: JDK版本 不能<1.5. 
虽然预处理注解是安全的,但自动侦查注解可能发生竞争条件.

两分钟简单教程 
http://xstream.codehaus.org/tutorial.html

XML解析器  
1. XPP3 (需要 xpp3-[version].jar) 
XStream xstream = new XStream(new XppDriver());

2. JAXP DOM 
XStream xstream = new XStream(new DomDriver());

类型别名Alias  
XStream 默认使用完全限制类名作为XML的元素名称.通过使用别名可修改元素名称为指定名称. 
xstream.alias("person", Person.class); 
xstream.alias("phonenumber", PhoneNumber.class);

字段别名  
Stream 默认使用字段名, 优先级高于类型. 
集合字段中的对象默认使用类型别名. 
xstream.aliasField("phonenumber", Person.class, "phone");

注意: Person.class  是包含此字段的类,而不是字段的类型.字段是phone, 别名是phonenumber. 下面也是如此.

序列化与反序列化  
对象不需要实现序列化接口. 反序列的对象与原对象不是同一对象. 
String xml = xstream.toXML(obj);

T obj = (T)xstream.fromXML(xml);

隐式集合  
当我们使用集合类时不想显示集合,只显示里面的元素即可. 
使用隐式集合前:

<list> 
   <element /> 
   <element /> 
<list>

使用隐式集合: 
xstream.addImplicitCollection(Person.class, "list");

使用隐式集合后:

<element /> 
   <element />

XML属性  
将类的字段转换成类映射元素的一个属性,而不是元素. 
xstream.useAttributeFor(Blog.class, "author"); 
xstream.registerConverter(new AuthorConverter()); //  注册将对象转换成字符串的转换类.

class AuthorConverter implements SingleValueConverter {

public String toString(Object obj) { 
                return ((Author) obj).getName(); 
        }

public Object fromString(String name) { 
                return new Author(name); 
        }

public boolean canConvert(Class type) { 
                return type.equals(Author.class); 
        }

}

SingleValueConverter  转换成简单字符串 
Converter                  转换成对象

包别名  
xstream.aliasPackage("my.company", "org.thoughtworks");

注解  
@XStreamAlias("message") 别名注解 
作用目标: 类,字段

@XStreamImplicit 隐式集合 
@XStreamImplicit(itemFieldName="part") 
作用目标: 集合字段

@XStreamConverter(SingleValueCalendarConverter.class) 注入转换器 
作用目标: 对象

@XStreamAsAttribute 转换成属性 
作用目标: 字段

@XStreamOmitField 忽略字段 
作用目标: 字段

Auto-detect Annotations 自动侦查注解  
xstream.autodetectAnnotations(true);

自动侦查注解与XStream.processAnnotations(Class[] cls)的区别在于性能.自动侦查注解将缓存所有类的类型.

对象流  
bjectOutputStream out = xstream.createObjectOutputStream(someWriter); 
ObjectInputStream in = xstream.createObjectInputStream(someReader);

持久化对象

public void persist(String dir, List objects) 

PersistenceStrategy strategy = new FilePersistenceStrategy(new File(System.getProperty("user.home"), dir));

List<?> list = new XmlArrayList(strategy);

list.addAll(objects); 
}

JSON  
解析器: 
Jettison StAX

XStreamFacade.java

Java代码  
  1. package cn.bisoft.java.test;
  2. import java.io.File;
  3. import java.util.List;
  4. import com.thoughtworks.xstream.XStream;
  5. import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
  6. import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
  7. import com.thoughtworks.xstream.io.xml.DomDriver;
  8. import com.thoughtworks.xstream.io.xml.XppDriver;
  9. import com.thoughtworks.xstream.persistence.FilePersistenceStrategy;
  10. import com.thoughtworks.xstream.persistence.PersistenceStrategy;
  11. import com.thoughtworks.xstream.persistence.XmlArrayList;
  12. public class XStreamFacade
  13. {
  14. private static XStream xstream;
  15. public static final String JAXP_DOM_XML = "JAXP DOM";
  16. public static final String XPP3_XML_PARSER = "XPP3";
  17. public static final String STAX_JSON_PARSER = "Jettison StAX";
  18. public static final String WRITER_JSON_PARSER = "Only Writer JSON";
  19. public synchronized static XStream getXStream(String driver)
  20. {
  21. if (JAXP_DOM_XML.equals(driver))
  22. {
  23. xstream = new XStream(new DomDriver());
  24. xstream.autodetectAnnotations(true);
  25. }
  26. else if (XPP3_XML_PARSER.equals(driver))
  27. {
  28. xstream = new XStream(new XppDriver());
  29. xstream.autodetectAnnotations(true);
  30. }
  31. else if (STAX_JSON_PARSER.equals(driver))
  32. {
  33. xstream = new XStream(new JettisonMappedXmlDriver());
  34. xstream.setMode(XStream.NO_REFERENCES);
  35. }
  36. else if (WRITER_JSON_PARSER.equals(driver))
  37. {
  38. xstream = new XStream(new JsonHierarchicalStreamDriver());
  39. xstream.setMode(XStream.NO_REFERENCES);
  40. }
  41. else
  42. {
  43. xstream = new XStream(new DomDriver());
  44. }
  45. return xstream;
  46. }
  47. @SuppressWarnings("unchecked")
  48. public void persist(String dir, List objects)
  49. {
  50. PersistenceStrategy strategy = new FilePersistenceStrategy(new File(System.getProperty("user.home"), dir));
  51. List<?> list = new XmlArrayList(strategy);
  52. list.addAll(objects);
  53. }
  54. }

------------ 
扩展: 
1. 
XBird

2. 
XStream.XPATH_RELATIVE_REFERENCES

(Default) Uses relative XPath references to signify duplicate references. This produces XML with the least clutter.

XStream.XPATH_ABSOLUTE_REFERENCES 
Uses absolute XPath references to signify duplicate references. This might produce for some situations better readable XML. Note, that XStream will read XML with relative paths as well as with absolute paths independent of the XPATH mode.

XStream.ID_REFERENCES 
Uses ID references to signify duplicate references. In some scenarios, such as when using hand-written XML, this is easier to work with.

XStream.NO_REFERENCES 
This disables object graph support and treats the object structure like a tree. Duplicate references are treated as two separate objects and circular references cause an exception. This is slightly faster and uses less memory than the other two modes.

3. 
转换器

示例

XStreamFacade.java

Java代码  
  1. package cn.bisoft.java.test;
  2. import java.io.File;
  3. import java.util.List;
  4. import com.thoughtworks.xstream.XStream;
  5. import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
  6. import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider;
  7. import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
  8. import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
  9. import com.thoughtworks.xstream.io.xml.DomDriver;
  10. import com.thoughtworks.xstream.io.xml.XppDriver;
  11. import com.thoughtworks.xstream.persistence.FilePersistenceStrategy;
  12. import com.thoughtworks.xstream.persistence.PersistenceStrategy;
  13. import com.thoughtworks.xstream.persistence.XmlArrayList;
  14. /**
  15. * XStreamFacade
  16. *
  17. * <pre>
  18. * 提供对XStream的初始化,降低使用XStream API的复杂性.
  19. * @link
  20. * </pre>
  21. * @author tl
  22. * @version 1.0, 2011-6-10
  23. */
  24. public class XStreamFacade
  25. {
  26. public static final String JAXP_DOM_XML = "JAXP DOM";
  27. public static final String XPP3_XML_PARSER = "XPP3";
  28. public static final String STAX_JSON_PARSER = "Jettison StAX";
  29. public static final String WRITER_JSON_PARSER = "Only Writer JSON";
  30. /**
  31. * 获取XStream对象.
  32. *
  33. * <pre>
  34. * 根据驱动获取XStream对象,若没有提供驱动,则默认使用JAXP-DOM驱动.
  35. * </pre>
  36. * @param driver 驱动名称
  37. * @param isStaticSupported 是否支持静态变量转换
  38. * @return XStream
  39. */
  40. public synchronized static XStream getXStream(String driver, boolean isStaticSupported)
  41. {
  42. ReflectionProvider reflectProvider = null;
  43. if (isStaticSupported)
  44. {
  45. reflectProvider = new EnhancedModeReflectProvider();
  46. }
  47. else
  48. {
  49. reflectProvider = new Sun14ReflectionProvider();
  50. }
  51. if (JAXP_DOM_XML.equals(driver))
  52. {
  53. xstream = new XStream(reflectProvider, new DomDriver());
  54. xstream.autodetectAnnotations(true);
  55. System.err.println(xstream.getReflectionProvider());
  56. }
  57. else if (XPP3_XML_PARSER.equals(driver))
  58. {
  59. xstream = new XStream(reflectProvider, new XppDriver());
  60. xstream.autodetectAnnotations(true);
  61. }
  62. else if (STAX_JSON_PARSER.equals(driver))
  63. {
  64. xstream = new XStream(reflectProvider, new JettisonMappedXmlDriver());
  65. xstream.setMode(XStream.NO_REFERENCES);
  66. }
  67. else if (WRITER_JSON_PARSER.equals(driver))
  68. {
  69. xstream = new XStream(reflectProvider, new JsonHierarchicalStreamDriver());
  70. xstream.setMode(XStream.NO_REFERENCES);
  71. }
  72. else
  73. {
  74. xstream = new XStream(reflectProvider, new DomDriver());
  75. }
  76. return xstream;
  77. }
  78. /**
  79. * 持久化对象列表.
  80. *
  81. * <pre>
  82. *      持久化对象列表,存储到指定用户主目录下的指定目录
  83. * </pre>
  84. * @param dir 目录
  85. * @param objects 对象列表
  86. */
  87. @SuppressWarnings("unchecked")
  88. public void persist(String dir, List objects)
  89. {
  90. PersistenceStrategy strategy = new FilePersistenceStrategy(new File(System.getProperty("user.home"), dir));
  91. List<?> list = new XmlArrayList(strategy);
  92. list.addAll(objects);
  93. }
  94. // prinvate fields.
  95. private static XStream xstream;
  96. }

EnhancedModeReflectProvider.java

Java代码  
  1. /**
  2. * <pre>
  3. * Title:       EnhancedModeReflectProvider.java
  4. * Author:      tl
  5. * Create:      2011-6-10 下午02:50:18
  6. * Copyright:   Copyright (c) 2011
  7. * Company:     Shenzhen *****
  8. * <pre>
  9. */
  10. package cn.bisoft.java.test;
  11. import java.lang.reflect.Field;
  12. import java.lang.reflect.Modifier;
  13. import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider;
  14. /**
  15. * <pre>
  16. * 支持静态字段转换,但有缺陷,字段不能映射成属性.
  17. * </pre>
  18. * @author tl
  19. * @version 1.0, 2011-6-10
  20. */
  21. public class EnhancedModeReflectProvider extends Sun14ReflectionProvider
  22. {
  23. @Override
  24. protected boolean fieldModifiersSupported(Field field)
  25. {
  26. return !(Modifier.isTransient(field.getModifiers()));
  27. }
  28. }

ExampleMessageBody.java

Java代码  
  1. package cn.bisoft.java.test;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import com.thoughtworks.xstream.annotations.XStreamAlias;
  6. import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
  7. import com.thoughtworks.xstream.annotations.XStreamInclude;
  8. import com.thoughtworks.xstream.annotations.XStreamOmitField;
  9. @SuppressWarnings("unused")
  10. @XStreamAlias("body")
  11. public class ExampleMessageBody
  12. {
  13. @XStreamAsAttribute
  14. private static final String type = "example";
  15. private String id = "message id";
  16. private Date timestamp;
  17. /** 当userList节点必须存在是, 需要初始化. 值为空的字段是不会输出到XML的. */
  18. @XStreamAlias("users")
  19. private List<User> userList = new ArrayList<User>();
  20. @XStreamAlias("user")
  21. public static class User
  22. {
  23. @XStreamAsAttribute
  24. private String id;
  25. @XStreamAsAttribute
  26. private Date birth;
  27. @XStreamOmitField
  28. private String password;
  29. public String getId()
  30. {
  31. return id;
  32. }
  33. public void setId(String id)
  34. {
  35. this.id = id;
  36. }
  37. public Date getBirth()
  38. {
  39. return birth;
  40. }
  41. public void setBirth(Date birth)
  42. {
  43. this.birth = birth;
  44. }
  45. public String getPassword()
  46. {
  47. return password;
  48. }
  49. public void setPassword(String password)
  50. {
  51. this.password = password;
  52. }
  53. }
  54. public String getId()
  55. {
  56. return id;
  57. }
  58. public void setId(String id)
  59. {
  60. this.id = id;
  61. }
  62. public Date getTimestamp()
  63. {
  64. return timestamp;
  65. }
  66. public void setTimestamp(Date timestamp)
  67. {
  68. this.timestamp = timestamp;
  69. }
  70. public List<User> getUserList()
  71. {
  72. return userList;
  73. }
  74. public void setUserList(List<User> userList)
  75. {
  76. this.userList = userList;
  77. }
  78. }

TestXStream.java

Java代码  
  1. package cn.bisoft.java.test;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import com.thoughtworks.xstream.XStream;
  6. public class TestXStream
  7. {
  8. public static void main(String[] args)
  9. {
  10. XStream xstream = XStreamFacade.getXStream(XStreamFacade.JAXP_DOM_XML, true);
  11. ExampleMessageBody body = new ExampleMessageBody();
  12. body.setId("0");
  13. body.setTimestamp(new Date());
  14. List<ExampleMessageBody.User> userList = new ArrayList<ExampleMessageBody.User>();
  15. ExampleMessageBody.User user = new ExampleMessageBody.User();
  16. user.setBirth(new Date());
  17. user.setId("tl");
  18. user.setPassword("123456");
  19. userList.add(user);
  20. body.setUserList(userList);
  21. xstream.useAttributeFor("type", ExampleMessageBody.class);
  22. String xml = xstream.toXML(body);
  23. System.out.println(xml);
  24. }
  25. }

说明: 
1. 静态字段其实没有必要序列化. 
2. 集合类型通常需要进行初始化.

XStream的分析相关推荐

  1. [转载] XStream的分析

    参考链接: XStream教程 XStream是一个序列化对象为XML或XML转换为对象的库. 特点: 简化的API; 无映射文件; 高性能,低内存占用; 整洁的XML; 不需要修改对象;支持内部私有 ...

  2. XStream反序列化漏洞分析

    XStream反序列化漏洞分析 XStream反序列化漏洞分析 代理模式 EventHandler XStream 生成payload XStream流程分析 写在最后 XStream反序列化漏洞分析 ...

  3. XStream 反序列化漏洞 (CVE-2020-26258 26259) 的复现与分析

     聚焦源代码安全,网罗国内外最新资讯! Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象.XStream 是一款开源软件,允许在 BSD 许可证的许可下分 ...

  4. 【组件攻击链】XStream组件高危漏洞分析与利用

    组件介绍 XStream是Java类库,用来将对象序列化成XML(JSON)或反序列化为对象.XStream在运行时使用Java反射机制对要进行序列化的对象树的结构进行探索,并不需要对对象作出修改.X ...

  5. XML,Object,Json分析转换Xstream采用

    XML,Object,Json转换之浅析Xstream的使用 请尊重他人的劳动成果,转载请注明出处:XML,Object,Json转换之浅析Xstream的使用 XStream的是一个简单的库.主要用 ...

  6. XStream分析(2)

    XStream 使用XStream的初衷 研究和使用XStream的原因是我在项目中的一个预研.在项目中需要应用到对XML文件的管理和配置,因此需要一个能够将对象保存为XML的工具库,在这里有多种方法 ...

  7. SpringMVC4.x源码分析(七):使用XStream处理xml请求和响应消息实战

    2019独角兽企业重金招聘Python工程师标准>>> 本节使用MarshallingHttpMessageConverter+xstream来处理xml请求和响应消息,首先加入sp ...

  8. 微信公众平台开发中-SAE不支持XStream框架的解决方案

    问题描述 最近几天(2014年8月20日之后),突然有不少网友反应,柳峰博客中的微信公众平台开发代码在SAE上运行会报错,或者是能正常部署,但向公众号发消息没反应.以前也有一些初学者质疑过我博客中的代 ...

  9. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

最新文章

  1. ASP.NET将Session保存到数据库中
  2. 【深度学习基础】一步一步讲解卷积神经网络
  3. jira+mysql配置
  4. 安装JDK时提示 IllegalArgumentException:Invalid characters in hostname的解决方法
  5. 27_pytorch全连接层,使用MNIST的分类案例(学习笔记)
  6. IBM将利用Watson进行报税 以彰显人工智能优势
  7. 微信小程序|开发实战篇之十-一些细节处理
  8. android listview动态添加viewpager,请教大神,android如何在viewpager里添加listview,谢谢啦...
  9. 御坂搜索引擎_MisakaTranslator下载|MisakaTranslator御坂翻译器 v2.1 正式整合版下载
  10. matplotlib绘图技巧详解(三)
  11. ADC噪声全面分析 -01- ADC噪声的类型以及ADC特性
  12. python获取本月第一天 最后一天
  13. 正则表达式的进阶用法——预查与分组
  14. c语言通用数据结构和常用算法库,基于C语言的通用数据结构和算法库
  15. mysql怎样添加一条数据_sql语句怎么添加一条记录?
  16. 国内网络环境安装QIIME2(100%成功)
  17. pandas学习之pandas基础
  18. 经典的汽车车灯模具结构解析
  19. 程序人生 | (8) 好的研究想法从哪里来
  20. VirtualBox修改虚拟磁盘virtualbox vms存放位置

热门文章

  1. PPPoE与802.1X在校园网中的应用分析
  2. omniplan导出html,MAC系统下的甘特图神器——Omniplan3使用指南
  3. 谈谈低延迟对音质的负面影响,顺便谈谈WASAPI
  4. 空字符串:“”和null的区别。
  5. 基于dtmf发送救援信息(gps坐标)传送的技术方案
  6. 函数getopt(),及其参数optind
  7. notepad ++ 百度云下载
  8. 1048 数字加密 (20分)
  9. Unity3D中C#调用iOS的静态库(*.a)
  10. SUST 2019暑期集训题解(差分约束+生成树+传递闭包)