xstream mapconverter
错误如下:
---- Debugging information ----
message : com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl cannot be cast to org.w3c.dom.Element
cause-exception : java.lang.ClassCastException
cause-message : com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl cannot be cast to org.w3c.dom.Element
class : java.util.HashMap
required-type : java.util.HashMap
path : /map
------------------------------
代码如下:
package test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.mapper.DefaultMapper;
import com.thoughtworks.xstream.mapper.Mapper;
public class MapConverter extends AbstractCollectionConverter {
public MapConverter(Mapper mapper) {
super(mapper);
}
public boolean canConvert(Class type) {
// 这里只列了HashMap一种情况
return type.equals(HashMap.class);
}
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
Map map = (Map) source;
for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {
Entry entry = (Entry) iterator.next();
if("java.lang.String".equals(entry.getValue().getClass().getName())){
ExtendedHierarchicalStreamWriterHelper.startNode(writer, entry.getKey().toString(), Entry.class);
writer.setValue(entry.getValue().toString());
writer.endNode();
}
// else if("java.util.HashMap".equals(entry.getValue().getClass().getName())){
// ExtendedHierarchicalStreamWriterHelper.startNode(writer, entry.getKey().toString(), Entry.class);
// context.convertAnother(entry.getValue());
// writer.endNode();
// }
}
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Map map = (Map) new HashMap();
reader.moveUp();
map.put(reader.getNodeName(), reader.getValue());
return map;
}
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("aa", "aa-0");
map.put("bb", "bb-0");
map.put("cc", "cc-0");
// Map<String, String> submap = new HashMap<String, String>();
// submap.put("aa", "aa-0");
// submap.put("bb", "bb-0");
// submap.put("cc", "cc-0");
// map.put("submap", submap);
XStream xStream = new XStream();
xStream.registerConverter(new MapConverter(new DefaultMapper(XStream.class.getClassLoader())));
xStream.alias("property", Entry.class);
String xml = xStream.toXML(map);
System.out.println(xml);
XStream xs2 = new XStream(new DomDriver());
xs2.registerConverter(new MapConverter(new DefaultMapper(XStream.class.getClassLoader())));
xs2.alias("property", Entry.class);
map = (Map<String, Object>) xs2.fromXML(xml);
System.out.println();
}
}
生成的xml如下:
<map>
<aa>aa-0</aa>
<bb>bb-0</bb>
<cc>cc-0</cc>
</map>
我想要简化xml如上,然后还能转换回来