使用轻量级的XStream可以很方便的将对象序列化为XML
此外,XStream还可自定义序列化和反序列的转换器(Converter)
下面的转换器可将Map/List序列化,或将其他POJO的序列化XML反转为Map/List
直接上代码 PojoMapConverter.java
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->package net.cnlab.vo.services.xstream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class PojoMapConverter implements Converter {
public PojoMapConverter() {
super();
}
public boolean canConvert(Class clazz) {
String classname = clazz.getName();
if (classname.indexOf("Map") >= 0
|| classname.indexOf("List") >= 0
|| classname.indexOf("Bean") >= 0)
return true;
else
return false;
}
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
map2xml(value, writer, context);
}
protected void map2xml(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
boolean bMap = true;
String classname = value.getClass().getName();
bMap = (classname.indexOf("List") < 0);
Map<String, Object> map;
List<Object> list;
String key;
Object subvalue;
if (bMap) {
map = (Map<String, Object>) value;
for (Iterator<Entry<String, Object>> iterator = map.entrySet()
.iterator(); iterator.hasNext();) {
Entry<String, Object> entry = (Entry<String, Object>) iterator
.next();
key = (String) entry.getKey();
subvalue = entry.getValue();
writer.startNode(key);
if (subvalue.getClass().getName().indexOf("String") >= 0) {
writer.setValue((String) subvalue);
} else {
map2xml(subvalue, writer, context);
}
writer.endNode();
}
} else {
list = (List<Object>) value;
for (Object subval : list) {
subvalue = subval;
writer.startNode("child");
if (subvalue.getClass().getName().indexOf("String") >= 0) {
writer.setValue((String) subvalue);
} else {
map2xml(subvalue, writer, context);
}
writer.endNode();
}
}
}
public Map<String, Object> unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Map<String, Object> map = (Map<String, Object>) populateMap(reader,
context);
return map;
}
protected Object populateMap(HierarchicalStreamReader reader,
UnmarshallingContext context) {
boolean bMap = true;
Map<String, Object> map = new HashMap<String, Object>();
List<Object> list = new ArrayList<Object>();
while (reader.hasMoreChildren()) {
reader.moveDown();
String key = reader.getNodeName();
Object value = null;
if (reader.hasMoreChildren()) {
value = populateMap(reader, context);
} else {
value = reader.getValue();
}
if (bMap) {
if (map.containsKey(key)) {
// convert to list
bMap = false;
Iterator<Entry<String, Object>> iter = map.entrySet()
.iterator();
while (iter.hasNext())
list.add(iter.next().getValue());
// insert into list
list.add(value);
} else {
// insert into map
map.put(key, value);
}
} else {
// insert into list
list.add(value);
}
reader.moveUp();
}
if (bMap)
return map;
else
return list;
}
}
通过XStream中注册该转换器,即可用toXML和fromXML转换
使用示例,将xml转为Map/List,然后再转换为xml
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public static void main(String[] args) {
String xml = "<map><stars><star><id>1</id><name>littleflower</name></star><star><id>2</id><name>littleyellow</name></star></stars> <filename>cnlab</filename> <ra>147.0</ra> <dec>0.0</dec> <plate>0.0</plate> <mdj>0.0</mdj> </map> ";
XStream xstream = new XStream(new DomDriver());
xstream.registerConverter(new PojoMapConverter());
Map<String, Object> map = (Map<String, Object>)xstream.fromXML(xml);
System.out.println(map);
xml = xstream.toXML(map);
System.out.println(xml);
System.out.println((Map<String, Object>)xstream.fromXML(xml));
分享到:
相关推荐
使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列...
使用xstream解析xml,xml与pojo的双向转化,完整的java 工程 带jar包和测试类,可以直接跑
使用XStream序列化/反序列化对象
XStream在运行时使用Java反射机制对要进行序列化的对象树的结构进行探索,并不需要对对象作出修改。XStream可以序列化内部字段,包括私private和final字段,并且支持非公开类以及内部类。 在缺省情况下,XStream不...
NULL 博文链接:https://dolphin-ygj.iteye.com/blog/567748
这个是 对于要把数据库获得的 list 转换成 xml 有了XStream在Java对象和XML之间相互转换 就变得非常容易了 嘿嘿
XStream:XStream是一个简单易用的Java库,用于序列化和反序列化对象。它可以将Java对象转换为XML文档,也可以将XML文档转换为Java对象。 pom引用 <groupId>com.thoughtworks.xstream</groupId> <artifactId>...
Xstream_java对象和xml的互相转换
webService接口对接时,需要传递一个xml内容。用xStream拼接xml
使用xStream实现java对象和xml、json的相互转换
java中对象与xml转换,实例带完整源码
一个小demo展示xml的两种解析方式和四种解析方法,以及使用XStream进行javaBean与xml、json之间的转换
使用xstream进行java类与xml文件互转解析
Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将javaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁琐。XStream使用起来非常简单,不需要预先生成相关...
xstream轻松解析xml到java对象,内附样例。so easy!妈妈再也不用担心我的xml解析。
好用的xStream XML和JAVA对象互相转换的简单示例,内附依赖的xstream-1.3.1.jar和xpp3_min-1.1.4c.jar
Xstream生产xml和解析xml
使用 XStream 把 Java 对象序列化为 XML
xml-pull-1.3.1.jar工具类,xstream-1.3.jar,XStream是一个Java对象和XML相互转换的工具,很好很强大。提供了所有的基础类型、数组、集合等类型直接转换的支持。 因此XML常用于数据交换、对象序列化(这种序列化和...