Serializing .NET dictionary

Posted by Anuraj on Tuesday, September 16, 2014

.Net .Net 3.0 / 3.5 .Net 4.0 ASP.Net MVC Unit Testing

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 :)


Similar Posts


Did you like this article? Share it with your friends

Facebook Twitter Google+ LinkedIn Reddit StumbleUpon



Translate
Subscribe
BMC logoBuy me a coffee


Copyright © 2018 - Anuraj P. 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. Hosted with ❤ by GitHub