Code Snippet

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

使用轻量级的XStream可以很方便的将对象序列化为XML

 

此外,XStream还可自定义序列化和反序列的转换器(Converter)

 

下面的转换器可将Map/List序列化,或将其他POJO的序列化XML反转为Map/List

 

直接上代码 PojoMapConverter.java

 

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

 

 

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));

 

 

 

posted on 2010-09-24 09:08  kmlxk  阅读(2537)  评论(0编辑  收藏  举报