2010-05-17 9 views
3

Je suis en train de désérialiserC# System.Xml.Serialization éléments auto-imbriqués

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

avec

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

mais il ne cesse de dire l'objet n'a pas été créé, référence null lors de la tentative de définir des nœuds enfants . Quel est le problème ci-dessus?

Merci d'avance ~

+0

La sémantique de vos setters pourraient ne pas être ce que vous attendez. Ils ajoutent toujours plus d'éléments au tableau. –

+0

Salut Jordao, que "plus d'éléments" sont là pour ajouter? Y a-t-il une référence que je peux suivre? Lorsque vous utilisez des tableaux typés, cela fonctionne. D'une certaine manière, le sérialiseur traite les propriétés et les variables publiques différemment? – Jake

Répondre

1

Vous problème est dans le gestionnaire de jeu (s), ajouter sinon null:

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

Merci, en effet, il a résolu le problème. =) mais puis-je savoir pourquoi le sérialiseur enverrait des valeurs nulles pour une propriété mais pas pour un tableau de membres typé public – Jake

1

Je ne peux pas reproduire votre erreur. J'ai utilisé le code suivant:

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

Pouvez-vous publier ce que vous utilisez pour désérialiser?

+0

Salut Yuriy, je n'ai pas non plus de problèmes lors de l'utilisation de tableaux typés, c'est-à-dire Node [] enfants. Le problème se produit uniquement lors de l'utilisation de la liste enfants dans le setter de la propriété sérialisée. – Jake