xStream问题 - 如何反序列化未声明的属性

时间:2015-01-27 14:49:50

标签: java xml xstream

我使用xStream反序列化XML。

我的xml包含一个标记:

<Element Name="Test" Value="TestValue" Tag="tag" Text.Color="Red"/>

和班级

public class Element {

   @XStreamAsAttribute
   public String Name;

   @XStreamAsAttribute
   public String Value;

   public Map<String, String> AnyAttr = new HashMap<String, String>();   
}

字段名称和值反序列化正确,

如何将未声明的字段(Tag,Text.Color)反序列化为我的地图(Map AnyAttr)?

2 个答案:

答案 0 :(得分:0)

您可以自己编写Converter。这是唯一的方法,您可以通过简单的配置实现这一目标。

答案 1 :(得分:0)

您必须创建自定义Converter类。像这样:

public class ElementConverter implements Converter
{
    public boolean canConvert(Class clazz) {
        return Element.class == clazz;
    }

    public void marshal(Object object, HierarchicalStreamWriter hsw, MarshallingContext mc) {
        Element e = (Element) object;
        hsw.addAttribute("Name", e.Name);
        hsw.addAttribute("Value", e.Value);
        for (Map.Entry<String, String> entry : e.AnyAttr.entrySet())
        {
            hsw.addAttribute(entry.getKey(), entry.getValue());
        }
    }

    public Object unmarshal(HierarchicalStreamReader hsr, UnmarshallingContext uc) {
        Element e = new Element();
        String key;
        int count = hsr.getAttributeCount();
        for (int i = 0; i < count; i++)
        {
            key = hsr.getAttributeName(i);
            if (key.equals("Name")) e.Name = hsr.getAttribute(i);
            else
            if (key.equals("Value")) e.Value = hsr.getAttribute(i);
            else e.AnyAttr.put(key, hsr.getAttribute(i));
        }
        return e;
    }
}

然后你必须在使用之前在XStream中注册转换器:

    XStream xstream = new XStream();
    xstream.aliasType("Element", Element.class);
    xstream.registerConverter(new ElementConverter());