2010-05-03 5 views
1

Puis-je utiliser Linq-to-xml pour conserver mon état d'objet sans avoir à utiliser/savoir Xpath & XSD Syntax?Puis-je utiliser Linq-to-xml pour conserver mon état d'objet sans avoir à utiliser/savoir Xpath & XSD Syntax?

ie. vraiment à la recherche d'une façon simple mais flexible de conserver un graphique de données d'objets (par exemple, disons 2 ou 3 classes avec des associations) - si Linq-to-xml était aussi simple que de dire "persiste ce graphe en XML", interrogez-le via Linq, ou remettez-le en mémoire/changez/puis ré-enregistrez-le dans le fichier xml.

+0

(ajouté exemple complet) –

Répondre

3

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 
    } 
} 
+0

Il est en fait un graphe orienté. – Greg

+0

@Greg - alors 'DataContractSerializer' avec' preserveObjectReferences' réglé sur 'true' pourrait être la prochaine chose à essayer. Je * ne recommande pas 'BinaryFormatter', sauf pour quelques scénarios spécifiques. –

+0

Tks - Je vais jeter un coup d'oeil dans cette – Greg

Questions connexes