xstream mapconverter

zhoulinjolin 2012-01-02 05:26:08
错误如下:
---- 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如上,然后还能转换回来
...全文
336 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧