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>

問題は、コンテンツに到達すると、別のレベルで深くなるためにクラッシュすることです。

これは、XMLをDeSerializeする方法です。コンテンツなしで機能します。

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

そして最後に私のオブジェクト:

Items.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>();
    }

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 マーシャルを追加することで解決しました。

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