Vous n'avez généralement pas besoin de XPath ou XSD pour utiliser LINQ-to-XML, mais il ne fera pas ce que vous voulez. XmlSerializer
se rapproche, mais est un arborescence sérialiseur, pas un graphique sérialiseur.
DataContractSerializer
(.NET 3.0) offre un support de graphe via l'un des constructeurs surchargés, mais n'offre pas un contrôle total sur le xml.
BinaryFormatter
offre un support graphique et un fonctionnement basé sur les métadonnées/types, mais est très fragile si vous changez d'assemblage et n'est pas portable entre les plates-formes.
Je soupçonne que la chose à comprendre est: est-ce que mes données sont un arbre ou un graphique? XmlSerializer
peut déjà faire ce dont vous avez besoin.
using System;
using System.Runtime.Serialization;
using System.IO;
[DataContract]
public class Outer {
[DataMember]
public Inner Inner { get; set; }
}
[DataContract]
public class Inner {
[DataMember]
public Outer Outer { get; set; }
}
class Program {
static void Main() {
// make a cyclic graph
Outer outer = new Outer(), clone;
outer.Inner = new Inner { Outer = outer };
var dcs = new DataContractSerializer(typeof(Outer), null,
int.MaxValue, false, true, null);
using (MemoryStream ms = new MemoryStream()) {
dcs.WriteObject(ms, outer);
ms.Position = 0;
clone = (Outer)dcs.ReadObject(ms);
}
Console.WriteLine(ReferenceEquals(
clone, clone.Inner.Outer)); // true
}
}
(ajouté exemple complet) –