2010-06-09 8 views
0

Je voudrais enregistrer une instance d'une classe C# .NET dans SQL pour la récupération ultérieure. Je suis capable d'utiliser LINQ to SQL pour ajouter un enregistrement complet avec tout le xml qui compose la classe.Comment reconstruire la classe C# à partir de XML

Maintenant, comment puis-je récupérer ce fichier XML et reconstruire l'instance d'objet de classe?

+3

Il n'est pas clair que vous parlez de classe ou d'instance? – mathk

Répondre

6

sérialiser votre objet à une chaîne XML:

public static string ToXml<T>(T obj) 
    { 
     XmlWriterSettings settings = new XmlWriterSettings(); 

     settings.OmitXmlDeclaration = true; 
     using (Stream stream = new MemoryStream()) 
     using (XmlWriter writer = XmlWriter.Create(stream, settings)) 
     { 
      new XmlSerializer(obj.GetType()).Serialize(writer, obj); 
      writer.Flush(); 
      stream.Flush(); 
      stream.Position = 0; 
      using (TextReader reader = new StreamReader(stream)) 
      { 
       return reader.ReadToEnd(); 
      } 
     } 
    } 

deserialize une chaîne XML dans un objet:

public static T FromXml<T>(string xml) 
    { 
     using (TextReader reader = new StringReader(xml)) 
     { 
      try 
      { 
       return (T)new XmlSerializer(typeof(T)).Deserialize(reader); 
      } 
      catch (InvalidOperationException) 
      { 
       // string passed is not XML, return default 
       return default(T); 
      } 
     } 
    } 
+0

Grande réponse Jesse. Merci pour votre aide! – mcass20

+0

@ mcass20, vous êtes les bienvenus. Toujours un plaisir de partager du code et des techniques. –

0

Je recommanderais la sérialisation xml et la désérialisation.

Si j'ai une personne de classe définie avec:

public class Person 
{ 
    public int ID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

il enregistrer/charger à partir de XML est aussi simple que:

Person donald = new Person{ 
       ID=1, 
       FirstName="Donald", 
       LastName="Duck", 
       DateOfBirth=new DateTime(1950,1,1)}; 

//create a xml serializer with the required type 
XmlSerializer xs=new XmlSerializer(typeof(Person)); 

//open a stream to the file, and save the instance 
TextWriter tw = new StreamWriter(@"C:\donald.xml"); 
xs.Serialize(tw, donald); 
tw.Close(); 

//open a reader stream to the file, and just load the instance. 
TextReader tr = new StreamReader(@"C:\donald.xml"); 
Person donald2 = (Person) xs.Deserialize(tr); 
tr.Close(); 

caveat: Cela permet de sauvegarder uniquement les propriétés publiques/champs de une classe, en tant qu'éléments XML. Si vous voulez exercer un contrôle supplémentaire sur le XML généré, jetez un oeil aux attributs dans l'espace de nom System.Xml.Serialization (XmlAttributeAttribute est mon préféré),

+0

-1 pour ne pas utiliser un bloc 'using' autour de' StreamReader'. –

+0

Eh bien, je ferme les lecteurs/écrivains explicitement :) C'est intentionnel, puisque je n'aime pas utiliser 'using' quand je déclare des variables dans le bloc using, cela rend le code moins lisible. – SWeko

0

Vous pouvez utiliser XStream pour stocker l'objet en tant que XML. C'est assez facile à utiliser.

2

Comme d'autres mentionnent, sérialisation fera l'affaire, mais être au courant des formatteurs/sérialiseur, sinon ceci:

<?xml version="1.0" encoding="utf-8" ?>

fera partie de votre sérialisation. Utilisez autant que possible le DataContractSerializer.

Je vous recommande fortement de voir ceci: .NET XML Serialization without <?xml> text declaration avant de faire quoi que ce soit.

HTH

Questions connexes