using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.Xml.Serialization;
using Newtonsoft.Json.Linq;
internal static void Test()
HighLevelDictionary highLevelDictionary = new HighLevelDictionary();
LowLevelDictionary lowLevelDictionary = new LowLevelDictionary();
lowLevelDictionary.Add("S1", 0.00m);
lowLevelDictionary.Add("S2", 0.00m);
LowLevelDictionary lowLevelDictionary2 = new LowLevelDictionary();
lowLevelDictionary2.Add("S1", 4.00m);
lowLevelDictionary2.Add("S2", 4.00m);
highLevelDictionary.Add("One", lowLevelDictionary);
highLevelDictionary.Add("tWO", lowLevelDictionary2);
var result = BinaryFormatterHelper.ToBinary(highLevelDictionary);
var extraHighLevelDictionary = BinaryFormatterHelper.FromBinary<HighLevelDictionary>(result);
Console.WriteLine("Deserialized HighLevelDictionary contents: ");
Console.WriteLine(JsonConvert.SerializeObject(extraHighLevelDictionary, Newtonsoft.Json.Formatting.Indented));
if (!JToken.DeepEquals(JToken.FromObject(highLevelDictionary), JToken.FromObject(extraHighLevelDictionary)))
throw new InvalidOperationException("!JToken.DeepEquals(JToken.FromObject(highLevelDictionary), JToken.FromObject(extraHighLevelDictionary))");
Debug.WriteLine("Original and round-tripped dictionaries are equivalent");
public class HighLevelDictionary : SerializableDictionary<string, LowLevelDictionary>
public HighLevelDictionary()
protected HighLevelDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { }
public class LowLevelDictionary : SerializableDictionary<string, decimal>
protected LowLevelDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { }
public LowLevelDictionary()
public class SerializableDictionary<TKey, TVal> : Dictionary<TKey, TVal>, IXmlSerializable
public SerializableDictionary()
public SerializableDictionary(IDictionary<TKey, TVal> dictionary)
public SerializableDictionary(IEqualityComparer<TKey> comparer)
public SerializableDictionary(int capacity)
public SerializableDictionary(IDictionary<TKey, TVal> dictionary, IEqualityComparer<TKey> comparer)
: base(dictionary, comparer)
public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
: base(capacity, comparer)
#region ISerializable members
protected SerializableDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { }
private const string DictionaryNodeName = "Dictionary";
private const string ItemNodeName = "Item";
private const string KeyNodeName = "Key";
private const string ValueNodeName = "Value";
#region IXmlSerializable Members
void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
foreach (KeyValuePair<TKey, TVal> kvp in this)
writer.WriteStartElement(ItemNodeName);
writer.WriteStartElement(KeyNodeName);
KeySerializer.Serialize(writer, kvp.Key);
writer.WriteEndElement();
writer.WriteStartElement(ValueNodeName);
ValueSerializer.Serialize(writer, kvp.Value);
writer.WriteEndElement();
writer.WriteEndElement();
void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
if (reader.IsEmptyElement)
throw new XmlException("Error in Deserialization of Dictionary");
while (reader.NodeType != XmlNodeType.EndElement)
reader.ReadStartElement(ItemNodeName);
reader.ReadStartElement(KeyNodeName);
TKey key = (TKey)KeySerializer.Deserialize(reader);
reader.ReadStartElement(ValueNodeName);
TVal value = (TVal)ValueSerializer.Deserialize(reader);
System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
#region Private Properties
protected XmlSerializer ValueSerializer
if (valueSerializer == null)
valueSerializer = new XmlSerializer(typeof(TVal));
private XmlSerializer KeySerializer
if (keySerializer == null)
keySerializer = new XmlSerializer(typeof(TKey));
private XmlSerializer keySerializer = null;
private XmlSerializer valueSerializer = null;
public static void Main()
public static partial class BinaryFormatterHelper
public static byte[] ToBinary<T>(T obj)
using (var stream = new MemoryStream())
new BinaryFormatter().Serialize(stream, obj);
public static T FromBinary<T>(byte[] data)
using (var stream = new MemoryStream(data))
var formatter = new BinaryFormatter();
var obj = formatter.Deserialize(stream);