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