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