- 浏览: 7862299 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
在XML跟普通POJO的序列化过程中,有很多的方法,其中发现xstream这个包还是不错的,它的作者是大名鼎鼎的thoughtworks写的,下面简单分析下。
1 首先是POJO对象,比如:
public class Employee {
private String name;
private String designation;
private String department;
。。。。。。。。。。
2 把POJO变成XML对象
XStream xstream=new XStream(new DomDriver());
xstream.alias("employee",Employee.class);
strxml=xstream.toXML(person);
System.out.println(strxml);
3 把XML对象反序列化为POJO对象
String str="....."//XML
Employee employee=(Employee)xstream.fromXML(str);
System.out.println("姓名:"+employee.getName());
4 另外附上一个比较复杂的精彩例子:
public class XmlParser {
private static final Log log = LogFactory.getLog(XmlParser.class);
private static final String DEFAULT_ENCODING = "UTF-8";
/**
* 获取 XML 文件头 encoding 中指定字符集的查询匹配器。
*/
private static Pattern encodingPattern = Pattern.compile("<\\?xml.*\\s+encoding\\s*=\\s*[\"']?([\\w\\-_]+)[\"'\\s?><]", Pattern.DOTALL + Pattern.CASE_INSENSITIVE);
private static CustomXppDriver driver = new CustomXppDriver(new CustomReplacer());
private static boolean flat;
private static boolean notList;
/**
* 将 XML 文件解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parseXmlFile(String fileName) throws FileNotFoundException, UnsupportedEncodingException {
return parse(new File(fileName));
}
/**
* 将 XML 文件解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parse(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException {
Reader reader = null;
try {
reader = getXmlEncodingReader(new FileInputStream(xmlFile));
return parse(reader);
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception ignore) {
}
}
}
}
/**
* 将 XML 字节数组解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parse(byte[] xmlBytes) throws UnsupportedEncodingException {
return parse(getXmlEncodingReader(new ByteArrayInputStream(xmlBytes)));
}
/**
* 将 XML 字节数组,按照指定字符集解析为 Map 集合数据。
*/
public static Map parse(byte[] xmlBytes, String encoding) throws UnsupportedEncodingException {
HierarchicalStreamReader reader = driver.createReader(new ByteArrayInputStream(xmlBytes), encoding);
return getData(reader);
}
/**
* 将 XML 字符串,解析为 Map 集合数据。
* @param xmlStr 字符串
* @return 集合数据
*/
public static Map parse(String xmlStr) {
return parse(new StringReader(xmlStr));
}
/**
* 将 XML 字节流,解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析 */
public static Map parse(InputStream xmlStream) throws UnsupportedEncodingException {
return parse(getXmlEncodingReader(xmlStream));
}
/**
* 将 XML 字节流,按照指定字符集解析为 Map 集合数据。
* @param xmlStream 字节流
* @param encoding 字符集
* @return 集合数据
* @throws UnsupportedEncodingException 不支持的字符集异常
*/
public static Map parse(InputStream xmlStream, String encoding) throws UnsupportedEncodingException {
HierarchicalStreamReader reader = driver.createReader(xmlStream, encoding);
return getData(reader);
}
/**
* 将 XML 字符流,解析为 Map 集合数据。
* @param xmlReader 字符流
* @return 集合数据
*/
public static Map parse(Reader xmlReader) {
HierarchicalStreamReader reader = driver.createReader(xmlReader);
return getData(reader);
}
/**
* 获取字节流中 XML 内容指定的字符集编码,若 XML 中未指定编码,则返回 UTF-8。
* @param stream 字节流,必须支持 mark/reset 方法。
* @return 字符集
*/
public static String getEncoding(InputStream stream) {
String encoding = DEFAULT_ENCODING;
if (!stream.markSupported()) {
return encoding;
}
byte[] buf = new byte[70];
try {
stream.mark(100);
int len = stream.read(buf);
if (len > 0) {
String xmlHead = new String(buf, 0, len);
Matcher m = encodingPattern.matcher(xmlHead);
if (m.find()) {
encoding = m.group(1).trim();
}
}
stream.reset();
} catch (Throwable e) {
log.error("get xml encoding error!", e);
}
return encoding;
}
/**
* 将 XML 字节流,转换为支持 XML 内容指定编码的字符流,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
* @param stream 字节流
* @return 字符流
* @throws UnsupportedEncodingException 不支持的字符集异常
*/
private static Reader getXmlEncodingReader(InputStream stream) throws UnsupportedEncodingException {
stream = new BufferedInputStream(stream);
return new InputStreamReader(stream, getEncoding(stream));
}
/**
* 将 XML 字符流,解析为 Map 集合数据。
* @param reader XML 字符流读取对象
* @return 集合数据
*/
private static Map getData(HierarchicalStreamReader reader) {
Map data = new HashMap();
fillData(reader, data, flat);
return data;
}
/**
* 设置解析完成后,填充Map集合时是否采用集合的方法。默认采用集合方法。
* 集合:既XML节点名称相同的数据使用ArrayList集合进行存储。
* 单一:既XML节点名称相同的数据只取第一个值进行存储。
* @param notList
*/
public static void setNotList(boolean no){
notList = no;
}
public static boolean isNotList(){
return notList;
}
/**
* 设置解析完成后,是否采取平板填充模式填充 Map 集合。若不采用平板填充模式,则 Map 集合采用与 XML 节点级别相同的结构存储数据。默认不采用。
* 平板填充模式:即不论是 XML 的哪级节点数据,均填充到根集合中,若根集合已存在该名称的节点数据,则此节点名称的数据采用 List 对象顺序存储。
* @param flatType 是否采取平板填充模式。
*/
public static void setFlatType(boolean flatType) {
flat = flatType;
}
/**
* 是否采取平板填充模式填充 Map 集合?
* @return 是否采取平板填充模式。
*/
public static boolean isFlatType() {
return flat;
}
/**
* 解析 XML 字符流,并将数据填充到指定 Map 集合中。
* @param reader XML 字符流读取对象
* @param data 待填充数据集合
* @param flatType 是否采用平板填充模式
*/
private static void fillData(HierarchicalStreamReader reader, Map data, boolean flatType) {
Map childs;
String name = reader.getNodeName();
Object value;
if (!reader.hasMoreChildren()) {
value = reader.getValue();
childs = null;
} else if (!flatType) {
value = childs = new HashMap();
} else {
value = "";
childs = data;
}
Object nodeContainer = data.get(name);
//name名称重复的直接覆盖
if(notList){
if (nodeContainer == null) {
if (value != null) {
data.put(name, value);
}
}
}else{
//重复的生成list保存
if (nodeContainer == null) {
if (value != null) {
data.put(name, value);
}
} else if (nodeContainer instanceof ArrayList) {
((ArrayList)nodeContainer).add(value);
} else {
ArrayList nodeList = new ArrayList();
nodeList.add(nodeContainer);
nodeList.add(value);
data.put(name, nodeList);
}
}
while (reader.hasMoreChildren()) {
reader.moveDown();
fillData(reader, childs, flatType);
reader.moveUp();
}
}
/**
* 自定义 XPP 解析驱动类
* @author wd
*/
private static class CustomXppDriver extends XppDriver {
public CustomXppDriver() {
super(new CustomReplacer());
}
public CustomXppDriver(XmlFriendlyReplacer replacer) {
super(replacer);
}
/**
* 将 XML 字节流,转换为支持指定字符集编码的 XML 字符流读取对象。
* @param stream 字节流
* @param encoding 字符集
* @return XML 字符流读取对象
* @throws UnsupportedEncodingException 不支持的字符集异常
*/
public HierarchicalStreamReader createReader(InputStream stream, String encoding) throws UnsupportedEncodingException {
return createReader(new InputStreamReader(stream, encoding));
}
}
/**
* 自定义 XML 标签转换类
* @author wd
*/
private static class CustomReplacer extends XmlFriendlyReplacer {
public String escapeName(String name) {
return name;
}
public String unescapeName(String name) {
return name;
}
}
public static void main(String[] args) throws Exception {
java.io.ByteArrayOutputStream output = new java.io.ByteArrayOutputStream();
java.io.FileInputStream input = null;
byte[] data = new byte[1024];
int len = -1;
try {
input = new java.io.FileInputStream("c:\\test.txt");
for (;(len = input.read(data)) >= 0;) {
output.write(data, 0, len);
}
} catch (Exception e) {
throw e;
} finally {
if (input != null) {
try {
input.close();
} catch (Exception e) {
}
}
}
byte[] xmlBytes = getMsg(output.toString());
System.out.println("xml 内容=" + new String(xmlBytes, getEncoding(new java.io.ByteArrayInputStream(xmlBytes))));
XmlParser.setFlatType(true);
Map xml = XmlParser.parse(xmlBytes);
System.out.println();
System.out.println("xml 对象=" + xml);
}
1 首先是POJO对象,比如:
public class Employee {
private String name;
private String designation;
private String department;
。。。。。。。。。。
2 把POJO变成XML对象
XStream xstream=new XStream(new DomDriver());
xstream.alias("employee",Employee.class);
strxml=xstream.toXML(person);
System.out.println(strxml);
3 把XML对象反序列化为POJO对象
String str="....."//XML
Employee employee=(Employee)xstream.fromXML(str);
System.out.println("姓名:"+employee.getName());
4 另外附上一个比较复杂的精彩例子:
public class XmlParser {
private static final Log log = LogFactory.getLog(XmlParser.class);
private static final String DEFAULT_ENCODING = "UTF-8";
/**
* 获取 XML 文件头 encoding 中指定字符集的查询匹配器。
*/
private static Pattern encodingPattern = Pattern.compile("<\\?xml.*\\s+encoding\\s*=\\s*[\"']?([\\w\\-_]+)[\"'\\s?><]", Pattern.DOTALL + Pattern.CASE_INSENSITIVE);
private static CustomXppDriver driver = new CustomXppDriver(new CustomReplacer());
private static boolean flat;
private static boolean notList;
/**
* 将 XML 文件解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parseXmlFile(String fileName) throws FileNotFoundException, UnsupportedEncodingException {
return parse(new File(fileName));
}
/**
* 将 XML 文件解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parse(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException {
Reader reader = null;
try {
reader = getXmlEncodingReader(new FileInputStream(xmlFile));
return parse(reader);
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception ignore) {
}
}
}
}
/**
* 将 XML 字节数组解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parse(byte[] xmlBytes) throws UnsupportedEncodingException {
return parse(getXmlEncodingReader(new ByteArrayInputStream(xmlBytes)));
}
/**
* 将 XML 字节数组,按照指定字符集解析为 Map 集合数据。
*/
public static Map parse(byte[] xmlBytes, String encoding) throws UnsupportedEncodingException {
HierarchicalStreamReader reader = driver.createReader(new ByteArrayInputStream(xmlBytes), encoding);
return getData(reader);
}
/**
* 将 XML 字符串,解析为 Map 集合数据。
* @param xmlStr 字符串
* @return 集合数据
*/
public static Map parse(String xmlStr) {
return parse(new StringReader(xmlStr));
}
/**
* 将 XML 字节流,解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析 */
public static Map parse(InputStream xmlStream) throws UnsupportedEncodingException {
return parse(getXmlEncodingReader(xmlStream));
}
/**
* 将 XML 字节流,按照指定字符集解析为 Map 集合数据。
* @param xmlStream 字节流
* @param encoding 字符集
* @return 集合数据
* @throws UnsupportedEncodingException 不支持的字符集异常
*/
public static Map parse(InputStream xmlStream, String encoding) throws UnsupportedEncodingException {
HierarchicalStreamReader reader = driver.createReader(xmlStream, encoding);
return getData(reader);
}
/**
* 将 XML 字符流,解析为 Map 集合数据。
* @param xmlReader 字符流
* @return 集合数据
*/
public static Map parse(Reader xmlReader) {
HierarchicalStreamReader reader = driver.createReader(xmlReader);
return getData(reader);
}
/**
* 获取字节流中 XML 内容指定的字符集编码,若 XML 中未指定编码,则返回 UTF-8。
* @param stream 字节流,必须支持 mark/reset 方法。
* @return 字符集
*/
public static String getEncoding(InputStream stream) {
String encoding = DEFAULT_ENCODING;
if (!stream.markSupported()) {
return encoding;
}
byte[] buf = new byte[70];
try {
stream.mark(100);
int len = stream.read(buf);
if (len > 0) {
String xmlHead = new String(buf, 0, len);
Matcher m = encodingPattern.matcher(xmlHead);
if (m.find()) {
encoding = m.group(1).trim();
}
}
stream.reset();
} catch (Throwable e) {
log.error("get xml encoding error!", e);
}
return encoding;
}
/**
* 将 XML 字节流,转换为支持 XML 内容指定编码的字符流,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
* @param stream 字节流
* @return 字符流
* @throws UnsupportedEncodingException 不支持的字符集异常
*/
private static Reader getXmlEncodingReader(InputStream stream) throws UnsupportedEncodingException {
stream = new BufferedInputStream(stream);
return new InputStreamReader(stream, getEncoding(stream));
}
/**
* 将 XML 字符流,解析为 Map 集合数据。
* @param reader XML 字符流读取对象
* @return 集合数据
*/
private static Map getData(HierarchicalStreamReader reader) {
Map data = new HashMap();
fillData(reader, data, flat);
return data;
}
/**
* 设置解析完成后,填充Map集合时是否采用集合的方法。默认采用集合方法。
* 集合:既XML节点名称相同的数据使用ArrayList集合进行存储。
* 单一:既XML节点名称相同的数据只取第一个值进行存储。
* @param notList
*/
public static void setNotList(boolean no){
notList = no;
}
public static boolean isNotList(){
return notList;
}
/**
* 设置解析完成后,是否采取平板填充模式填充 Map 集合。若不采用平板填充模式,则 Map 集合采用与 XML 节点级别相同的结构存储数据。默认不采用。
* 平板填充模式:即不论是 XML 的哪级节点数据,均填充到根集合中,若根集合已存在该名称的节点数据,则此节点名称的数据采用 List 对象顺序存储。
* @param flatType 是否采取平板填充模式。
*/
public static void setFlatType(boolean flatType) {
flat = flatType;
}
/**
* 是否采取平板填充模式填充 Map 集合?
* @return 是否采取平板填充模式。
*/
public static boolean isFlatType() {
return flat;
}
/**
* 解析 XML 字符流,并将数据填充到指定 Map 集合中。
* @param reader XML 字符流读取对象
* @param data 待填充数据集合
* @param flatType 是否采用平板填充模式
*/
private static void fillData(HierarchicalStreamReader reader, Map data, boolean flatType) {
Map childs;
String name = reader.getNodeName();
Object value;
if (!reader.hasMoreChildren()) {
value = reader.getValue();
childs = null;
} else if (!flatType) {
value = childs = new HashMap();
} else {
value = "";
childs = data;
}
Object nodeContainer = data.get(name);
//name名称重复的直接覆盖
if(notList){
if (nodeContainer == null) {
if (value != null) {
data.put(name, value);
}
}
}else{
//重复的生成list保存
if (nodeContainer == null) {
if (value != null) {
data.put(name, value);
}
} else if (nodeContainer instanceof ArrayList) {
((ArrayList)nodeContainer).add(value);
} else {
ArrayList nodeList = new ArrayList();
nodeList.add(nodeContainer);
nodeList.add(value);
data.put(name, nodeList);
}
}
while (reader.hasMoreChildren()) {
reader.moveDown();
fillData(reader, childs, flatType);
reader.moveUp();
}
}
/**
* 自定义 XPP 解析驱动类
* @author wd
*/
private static class CustomXppDriver extends XppDriver {
public CustomXppDriver() {
super(new CustomReplacer());
}
public CustomXppDriver(XmlFriendlyReplacer replacer) {
super(replacer);
}
/**
* 将 XML 字节流,转换为支持指定字符集编码的 XML 字符流读取对象。
* @param stream 字节流
* @param encoding 字符集
* @return XML 字符流读取对象
* @throws UnsupportedEncodingException 不支持的字符集异常
*/
public HierarchicalStreamReader createReader(InputStream stream, String encoding) throws UnsupportedEncodingException {
return createReader(new InputStreamReader(stream, encoding));
}
}
/**
* 自定义 XML 标签转换类
* @author wd
*/
private static class CustomReplacer extends XmlFriendlyReplacer {
public String escapeName(String name) {
return name;
}
public String unescapeName(String name) {
return name;
}
}
public static void main(String[] args) throws Exception {
java.io.ByteArrayOutputStream output = new java.io.ByteArrayOutputStream();
java.io.FileInputStream input = null;
byte[] data = new byte[1024];
int len = -1;
try {
input = new java.io.FileInputStream("c:\\test.txt");
for (;(len = input.read(data)) >= 0;) {
output.write(data, 0, len);
}
} catch (Exception e) {
throw e;
} finally {
if (input != null) {
try {
input.close();
} catch (Exception e) {
}
}
}
byte[] xmlBytes = getMsg(output.toString());
System.out.println("xml 内容=" + new String(xmlBytes, getEncoding(new java.io.ByteArrayInputStream(xmlBytes))));
XmlParser.setFlatType(true);
Map xml = XmlParser.parse(xmlBytes);
System.out.println();
System.out.println("xml 对象=" + xml);
}
发表评论
-
复习:强迫线程顺序执行方式
2019-01-03 23:42 1495方法1: 三个线程,t1,t2,t3,如果一定要按顺序执行, ... -
(转)不错的前后端处理异常的方法
2019-01-02 23:16 1971前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是 ... -
info q的极客时间大咖说等资料下载
2018-08-15 08:40 3420info q的极客时间大咖说等资料下载,还有不少思维导图 链 ... -
CXF 客户端超时时间设置(非Spring配置方式)
2018-07-03 22:38 2192import org.apache.cxf.endpoint. ... -
(转)synchronized关键字画像:正确打开方式
2018-06-14 09:25 454https://mp.weixin.qq.com/s/b3Sx ... -
CountDownLatch的例子
2018-06-13 14:10 637public class StatsDemo { ... -
两道面试题,带你解析Java类加载机制
2018-06-12 16:29 562https://mp.weixin.qq.com/s/YTa0 ... -
Spring中获取request的几种方法,及其线程安全性分析
2018-06-11 09:03 631https://mp.weixin.qq.com/s/KeFJ ... -
内部类小结
2018-06-06 10:25 404https://mp.weixin.qq.com/s/hErv ... -
JVM虚拟机小结1
2018-06-04 20:43 4681 jps -l //列出详细的类名和进程ID 2)jps ... -
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3048微软提供了不少命令行 ... -
(收藏)深入分析Java的序列化与反序列化
2018-05-30 15:21 566https://mp.weixin.qq.com/s/T2Bn ... -
apache common包中的序列化工具
2018-05-30 09:10 1788什么是序列化 我们的 ... -
JAVA8 JVM的变化: 元空间(Metaspace)
2018-05-24 22:30 918本文将会分享至今为至我收集的关于永久代(Permanent G ... -
(转)服务器性能指标(一)——负载(Load)分析及问题排查
2018-05-21 21:03 1272原创: Hollis Hollis 负载 ... -
(转)对象复用
2018-05-20 15:27 815public class Student { priv ... -
mapreduce中入门中要注意的几点
2018-05-06 08:59 626在 mapreduce中,比如有如下的词: I love b ... -
HDFS的基本操作
2018-05-02 21:47 889-mkdir 在HDFS创建目录 ... -
一个不错的开源工具类,专门用来解析日志头部的,好用
2018-05-02 20:00 716一个不错的开源工具类,专门用来解析日志头部的,好用。 http ... -
介绍个不错的RESTFUL MOCK的工具wiremock
2018-04-27 21:02 1860介绍个不错的RESTFUL MOCK的工具wiremock,地 ...
相关推荐
xstream用于解析和生成XML文件最优方案
最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...
XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...
xstream最新版jar包
xstream详细用法,包括xml转换为bean及bean转换为xml
xstream-1.4.19.jar
赠送jar包:xstream-1.4.11.jar; 赠送原API文档:xstream-1.4.11-javadoc.jar; 赠送源代码:xstream-1.4.11-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.11.pom; 包含翻译后的API文档:xstream-1.4.11-...
xstream-1.4.20.jar
xstream jar包,java对象转xml以及xml转java对象,操作很简单。
XStream在运行时使用Java反射机制对要进行序列化的对象树的结构进行探索,并不需要对对象作出修改。XStream可以序列化内部字段,包括私private和final字段,并且支持非公开类以及内部类。 在缺省情况下,XStream不...
xstream 1.2 ,xstream 1.2.2.jar xstream 1.2 ,xstream 1.2.2.jar
XStream解析XML实例
XStream DOC
xstream-1.4.7.jar XML
xstream-1.4.2
xstream xstream-1.4.5.jar
xstream-1.4.2.jar,官网上也有,由于本人分没了,希望有分的同志给点分。如果你也每份,请上官网下,地址:http://xstream.codehaus.org/download.html
xstream所需要的jar包,xstream-1.4.9.jar、dom4j-1.6.1.jar、xpp3_min-1.1.4c.jar等
赠送jar包:xstream-1.4.7.jar; 赠送原API文档:xstream-1.4.7-javadoc.jar; 赠送源代码:xstream-1.4.7-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.7.pom; 包含翻译后的API文档:xstream-1.4.7-javadoc-...
修改XStream源码,解决SAE不支持XStream的问题。