web-dev-qa-db-fra.com

Sérialiser un objet sur XElement et le désérialiser en mémoire

Je veux sérialiser un objet en XML, mais je ne veux pas l'enregistrer sur le disque. Je veux le conserver dans une variable XElement (pour utiliser avec LINQ), puis désérialiser sur mon objet.

Comment puis-je faire ceci?

52
Arian

Vous pouvez utiliser ces deux méthodes d'extension pour sérialiser et désérialiser XElement et vos objets.

public static XElement ToXElement<T>(this object obj)
{
    using (var memoryStream = new MemoryStream())
    {
        using (TextWriter streamWriter = new StreamWriter(memoryStream))
        {
            var xmlSerializer = new XmlSerializer(typeof(T));
            xmlSerializer.Serialize(streamWriter, obj);
            return XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray()));
        }
    }
}

public static T FromXElement<T>(this XElement xElement)
{
        var xmlSerializer = new XmlSerializer(typeof(T));
        return (T)xmlSerializer.Deserialize(xElement.CreateReader());
}

USAGE

XElement element = myClass.ToXElement<MyClass>();
var newMyClass = element.FromXElement<MyClass>();
92
Abdul Munim

Vous pouvez utiliser XMLSerialization

La sérialisation XML est le processus de conversion du public d'un objet les propriétés et les champs dans un format série (dans ce cas, XML) pour stockage ou transport. La désérialisation recrée l'objet dans sa état d'origine de la sortie XML. Vous pouvez penser à la sérialisation en tant que une façon de sauvegarder l'état d'un objet dans un flux ou une mémoire tampon. Pour Par exemple, ASP.NET utilise la classe XmlSerializer pour coder XML Web messages de service

et XDocumentRepresents an XML document pour y parvenir

   using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;


namespace ConsoleApplication5
{
  public class Person
  {
    public int Age { get; set; }
    public string Name { get; set; }
  }

  class Program
  {
    static void Main(string[] args)
    {

      XmlSerializer xs = new XmlSerializer(typeof(Person));

      Person p = new Person();
      p.Age = 35;
      p.Name = "Arnold";

      Console.WriteLine("\n Before serializing...\n");
      Console.WriteLine(string.Format("Age = {0} Name = {1}", p.Age,p.Name));

      XDocument d = new XDocument();
      using (XmlWriter xw = d.CreateWriter())
        xs.Serialize(xw, p);

      // you can use LINQ on Elm now

      XElement Elm = d.Root;

      Console.WriteLine("\n From XElement...\n");

      Elm.Elements().All(e => { Console.WriteLine(string.Format("element name {0} , element value {1}", e.Name, e.Value)); return true; });

      //deserialize back to object
      Person pDeserialized = xs.Deserialize((d.CreateReader())) as Person;

      Console.WriteLine("\n After deserializing...\n");
      Console.WriteLine(string.Format("Age = {0} Name = {1}", p.Age, p.Name));

      Console.ReadLine();

    }
  }


}

et voici la sortie enter image description here

23
Surjit Samra

(Réponse tardive)

Sérialiser:

var doc = new XDocument();
var xmlSerializer = new XmlSerializer(typeof(MyClass));
using (var writer = doc.CreateWriter())
{
    xmlSerializer.Serialize(writer, obj);
}
// now you can use `doc`(XDocument) or `doc.Root` (XElement)

Désérialiser:

MyClass obj; 
using(var reader = doc.CreateReader())
{
    obj = (MyClass)xmlSerializer.Deserialize(reader);
}
12
Eren Ersönmez

Problèmes de ToXelement sans analyse de code, même réponse que Abdul Munim mais résolution des problèmes de CA (sauf pour CA1004, cela ne peut pas être résolu dans ce cas et est voulu par la suite)

    public static XElement ToXElement<T>(this object value)
    {
        MemoryStream memoryStream = null;
        try
        {
            memoryStream = new MemoryStream();
            using (TextWriter streamWriter = new StreamWriter(memoryStream))
            {
                memoryStream = null;
                var xmlSerializer = new XmlSerializer(typeof(T));
                xmlSerializer.Serialize(streamWriter, value);
                return XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray()));
            }
        }
        finally
        {
            if (memoryStream != null)
            {
                memoryStream.Dispose();
            }
        }
    }
0
Martijn