Serialize an object in XElement and deserialize it in memory

I want to serialize an object in XML, but I do not want to save it to disk. I want to save it in an XElement variable (for use with LINQ), and then Deserialize back to my object.

How can i do this?

+47
c # xml serialization linq
Dec 04 2018-11-11T00:
source share
5 answers

You can use these two extension methods to serialize and deserialize between XElement and your objects.

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

USING

 XElement element = myClass.ToXElement<MyClass>(); var newMyClass = element.FromXElement<MyClass>(); 
+82
Dec 04 '11 at 11:54 on
source share

You can use XMLSerialization

XML serialization is the process of converting a public property object and field into a serial format (in this case, XML) for storage or transportation. Deserialization re-creates the object in its original state with XML output . You can think of serialization as a way to save the state of an object into a stream or buffer. For example, ASP.NET uses the XmlSerializer class to encode XML Web service messages

and XDocument Represents an XML document to achieve this

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

and it displays here enter image description here

+20
Dec 04 '11 at 7:50
source share

(Late answer)

Serialization:

 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) 

Deserialize:

 MyClass obj; using(var reader = doc.CreateReader()) { obj = (MyClass)xmlSerializer.Deserialize(reader); } 
+9
Mar 05 '15 at 7:54
source share

ToXelement without problems with code analysis, the same answer as Abdul Munim, but fixed CA problems (except for CA1004, this cannot be solved in this case by design either)

  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
Jan 12 '17 at 13:13
source share

What about

 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: "); } } 
-one
Dec 04 '11 at 10:21
source share



All Articles