【问题标题】:xStream problems - How to deserialize undeclared attributesxStream 问题 - 如何反序列化未声明的属性
【发布时间】:2015-03-26 05:34:19
【问题描述】:

我正在使用 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)?

【问题讨论】:

    标签: java xml xstream


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您必须创建自定义转换器类。喜欢这个:

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

      【讨论】:

        猜你喜欢
        • 2013-04-02
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多