2010-05-17 31 views
3

我試圖反序列化C#的System.Xml.Serialization自我嵌套元素

<graph> 
<node> 
    <node> 
    <node></node> 
    </node> 
</node> 
<node> 
    <node> 
    <node></node> 
    </node> 
</node> 
</graph> 

[XmlRoot("graph")] 
class graph 
{ 
    List<Node> _children = new List<node>(); 

    [XmlElement("node")] 
    public Node[] node 
    { 
     get { return _children.ToArray(); } 
     set { foreach(Node n in value) children.add(n) } 
    }; 
} 

class Node 
{ 
    List<Node> _children = new List<node>(); 

    [XmlElement("node")] 
    public Node[] node 
    { 
     get { return _children.ToArray(); } 
     set { foreach(Node n in value) children.add(n) } 
    }; 
} 

但它口口聲聲說沒有對象創建,空引用遇到嘗試設置的子節點時。上面有什麼錯誤?

在此先感謝〜

+0

你制定者的語義可能不是你所期望的。他們總是添加更多的元素到數組中。 – 2010-05-17 18:45:03

+0

嗨Jordao,還有什麼「更多元素」添加?有沒有我可以遵循的參考?使用類型數組時,它就可以工作。不知怎的,序列化程序不同地處理財產和公共變量? – Jake 2010-05-18 07:24:10

回答

1

您的問題是在集處理器(S),添加如果不爲null:

set { if(value != null) foreach(Node n in value) children.add(n) } 
+0

謝謝,的確解決了這個問題。 =)但是我可以知道序列化程序爲什麼會爲空屬性發送空值,而不是爲公共類型的成員數組發送 – Jake 2010-05-18 07:31:33

1

我無法重現您的錯誤。我使用了下面的代碼:

string xml = @"<graph> 
<node> 
    <node> 
    <node></node> 
    </node> 
</node> 
<node> 
    <node> 
    <node></node> 
    </node> 
</node> 
</graph>"; 

[XmlRoot("graph")] 
public class graph 
{ 
    [XmlElement("node")] 
    public Node[] node; 
} 

public class Node 
{ 
    [XmlElement("node")] 
    public Node[] children; 
} 

XmlSerializer serializer = new XmlSerializer(typeof(graph)); 

using (MemoryStream stream = new MemoryStream()) 
using (StreamWriter writer = new StreamWriter(stream)) 
{ 
    writer.Write(xml.Replace(Environment.NewLine, String.Empty)); 
    writer.Flush(); 
    stream.Position = 0; 

    var graph = serializer.Deserialize(stream) as graph; 
} 

你可以發佈你使用的反序列化?

+0

嗨Yuriy,我也沒有問題,當使用類型數組,即Node []的孩子。只有在序列化屬性的setter中使用List 子項時纔會出現此問題。 – Jake 2010-05-18 07:22:43