Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use XDocument as the source for XmlSerializer.Deserialize?

I would like to invoke XmlSerializer.Deserialize passing it an XDocument. It can take a Stream, an XmlReader or a TextReader.

Can I generate one of the above from XDocument without actually dumping the XDocument into some intermediate store, such as a MemoryStream?

It seems that what I'm after is an implementation of XmlReader that works with an XDocument. I can't find one though.

like image 570
Roman Starkov Avatar asked Aug 18 '09 16:08

Roman Starkov


People also ask

Can I make XmlSerializer ignore the namespace on Deserialization?

Yes, you can tell the XmlSerializer to ignore namespaces during de-serialization.

How does the XmlSerializer work C#?

The XmlSerializer creates C# (. cs) files and compiles them into . dll files in the directory named by the TEMP environment variable; serialization occurs with those DLLs. These serialization assemblies can be generated in advance and signed by using the SGen.exe tool.


2 Answers

You can use XDocument.CreateReader() to create an XmlReader that reads the contents of the XDocument.

Equivalently, the following will work too.

XmlReader GetReader(XDocument doc) {     return doc.Root.CreateReader(); } 
like image 59
Steve Guidi Avatar answered Sep 28 '22 18:09

Steve Guidi


Here's a utility to serialize and deserialize objects to/from XDocument.

XDocument doc = SerializationUtil.Serialize(foo); Foo foo = SerializationUtil.Deserialize<Foo>(doc); 

Here's the class:

public static class SerializationUtil {     public static T Deserialize<T>(XDocument doc)     {         XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));          using (var reader = doc.Root.CreateReader())         {             return (T)xmlSerializer.Deserialize(reader);         }     }      public static XDocument Serialize<T>(T value)     {         XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));          XDocument doc = new XDocument();         using (var writer = doc.CreateWriter())         {             xmlSerializer.Serialize(writer, value);         }          return doc;     } } 
like image 25
Simon_Weaver Avatar answered Sep 28 '22 18:09

Simon_Weaver