1

已解决 将内容内容更改为:

// Lists
    @XStreamImplicit(itemFieldName = "Contents")
    public List<Contents> Contents = new ArrayList<Contents>();

我正在尝试反序列化以下 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Items>
   <Item>
      <type>Test</type>
      <uid>1</uid>
      <depends>1</depends>
      <catid>1</catid>
      <label>Test</label>
      <defaultVal>default</defaultVal>
      <answer>Test</answer>
      <Contents>
         <Content>
            <uid>1</uid>
            <label>Test</label>
         </Content>
      </Contents>
   </Item>
</Items>

问题是,当我到达 Contents 时,它会由于深入另一个级别而崩溃。

这就是我对我的 XML 进行反序列化的方式,它可以在没有内容的情况下工作。

public static Object DeSerializeFromXML(String xml, Class items, Class item)
{
    XStream xstream = new XStream();
    xstream.processAnnotations(new Class[] { items, item });

    return xstream.fromXML(xml);
}

下面是我如何调用 DeSerialize 方法:

Items reader = (Items)Data.Serialization.Instance().DeSerializeFromXML(xml, Items.class, Item.class);

最后我的对象:

物品.cs

@XStreamAlias("Items")
public class Items
{
    public Items() { items = new ArrayList<Item>(); }

    @XStreamImplicit(itemFieldName = "Item")
    public List<Item> items = new ArrayList<Item>();
}

物品.cs

@XStreamAlias("Item")
public class Item
{
    // Type
    public String type = "";

    // Ids
    public int uid = 0;
    public int catid = 0;
    public int depends = 0;

    // Values
    public String label = "";
    public String defaultVal = "";
    public String answer = "";

    // Lists
    public Contents content;    

    public Item()
    {
    }

    public Item(String type, int uid, int catid, int depends, String label,
            String defaultval, String answer)
    {
        this.type = type;
        this.uid = uid;
        this.catid = catid;
        this.depends = depends;
        this.label = label;
        this.defaultVal = defaultval;
        this.answer = answer;

        content = new Contents();
    }

    @XStreamAlias("Contents")
    public static class Contents
    {
        public Contents()
        {
            contents = new ArrayList<Content>();
        }

        @XStreamImplicit(itemFieldName = "Content")
        public List<Content> contents = new ArrayList<Content>();
    }

内容.cs

@XStreamAlias("Content")
public class Content
{
    public int uid = 0;
    public String label = "";

    public Content()
    {
    }

    public Content(int uid, String label)
    {
        this.uid = uid;
        this.label = label;
    }

我不太确定我对下一个级别的注释是否正确。任何帮助表示赞赏。

4

1 回答 1

0

通过将 Contents 更改为列表并将 XStream marshall 添加到它来解决它。

@XStreamImplicit(itemFieldName = "Contents")
public List<Contents> Contents = new ArrayList<Contents>();
于 2013-03-08T07:59:56.887 回答