55 votes

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

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

Comment puis-je le faire ?

98voto

Abdul Munim Points 9039

Vous pouvez utiliser ces deux méthodes d'extension pour effectuer la sérialisation et la désérialisation entre le 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>();

25voto

Surjit Samra Points 2797

Vous pouvez utiliser XMLSerialization

La sérialisation XML est le processus de conversion des propriétés et champs publics d'un objet d'un objet dans un format sériel (dans ce cas, XML) pour le stockage ou le transport. La désérialisation recrée l'objet dans son état original à partir de la sortie XML. état original à partir de la sortie XML . Vous pouvez considérer la sérialisation comme un moyen de sauvegarder l'état d'un objet dans un flux ou un tampon. Pour Par exemple, ASP.NET utilise la classe XmlSerializer pour coder les messages XML des services Web. XML

et XDocument Represents 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 le résultat enter image description here

19voto

Eren Ersönmez Points 13491

(Réponse tardive)

Serialize :

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

0voto

Martijn Points 377

ToXelement sans problèmes d'analyse de code, même réponse qu'Abdul Munim mais correction des problèmes d'AC (sauf pour CA1004, qui ne peut être résolu dans ce cas et qui est de conception)

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

-1voto

Esi Points 103

Qu'en est-il

public static byte[] BinarySerialize(Object obj)
        {
            byte[] serializedObject;
            MemoryStream ms = new MemoryStream();
            BinaryFormatter b = new BinaryFormatter();
            try
            {
                b.Serialize(ms, obj);
                ms.Seek(0, 0);
                serializedObject = ms.ToArray();
                ms.Close();
                return serializedObject;
            }
            catch
            {
                throw new SerializationException("Failed to serialize. Reason: ");
            }

        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X