Recently I had to implement XML Serialization in one of my class, it was deriving from base class, which has a dictionary property and XML Serialization was failing due to that. And here is the code snippet which will help you to serialize a .Net dictionary. It is implemented using IXmlSerializable interface
Here is the Unit Tests (It was TDD implementation :))
[ TestClass ]
public class SampleTests
{
[ TestMethod ]
public void TestSampleCanBeSerialized ()
{
var sample = new Sample ();
sample . Colors = new Dictionary < int , string >();
sample . Colors . Add ( 1 , "Red" );
sample . Colors . Add ( 2 , "Blue" );
Serialize ( sample );
}
[ TestMethod ]
public void TestSampleIsProperlySerialized ()
{
var sample = new Sample ();
sample . Colors = new Dictionary < int , string >();
sample . Colors . Add ( 1 , "Red" );
sample . Colors . Add ( 2 , "Blue" );
var result = Serialize ( sample );
Assert . IsNotNull ( result );
var newsample = DeSerialize ( result );
Assert . IsNotNull ( newsample , "Sample not created" );
Assert . IsNotNull ( newsample . Colors , "Couldn't create colors" );
Assert . AreEqual ( 2 , newsample . Colors . Count );
}
private static string Serialize ( Sample sample )
{
using ( var stringWriter = new StringWriter ())
{
XmlSerializer xmlSerializer = new XmlSerializer ( typeof ( Sample ));
xmlSerializer . Serialize ( stringWriter , sample );
return stringWriter . ToString ();
}
}
private static Sample DeSerialize ( string text )
{
using ( var stringReader = new StringReader ( text ))
{
XmlSerializer xmlSerializer = new XmlSerializer ( typeof ( Sample ));
return xmlSerializer . Deserialize ( stringReader ) as Sample ;
}
}
}
}
Here is the actual implementation.
public class Sample : IXmlSerializable
{
public Dictionary < int , string > Colors { get ; set ; }
public XmlSchema GetSchema ()
{
return null ;
}
public void ReadXml ( XmlReader reader )
{
var xmlDocument = new XmlDocument ();
xmlDocument . Load ( reader );
var colors = xmlDocument . SelectNodes ( "//Color" );
Colors = new Dictionary < int , string >();
foreach ( XmlNode color in colors )
{
Colors . Add ( int . Parse ( color . Attributes [ "Key" ]. Value . ToString ()), color . Attributes [ "Value" ]. Value . ToString ());
}
}
public void WriteXml ( XmlWriter writer )
{
writer . WriteStartElement ( "Sample" );
writer . WriteStartElement ( "Colors" );
foreach ( var color in Colors )
{
writer . WriteStartElement ( "Color" );
writer . WriteAttributeString ( "Key" , color . Key . ToString ());
writer . WriteAttributeString ( "Value" , color . Value );
writer . WriteEndElement ();
}
writer . WriteEndElement ();
writer . WriteEndElement ();
}
}
Happy Programming :)
Copyright © 2024 Anuraj . Blog content licensed under the Creative Commons CC BY 2.5 | Unless otherwise stated or granted, code samples licensed under the MIT license . This is a personal blog. The opinions expressed here represent my own and not those of my employer. Powered by Jekyll. Hosted with ❤ by GitHub