using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;
using System.Runtime.Serialization;
public static void Main()
var data = new MyDictionary();
data.Add("Key", "Value");
data.Add("Key2", "Value2");
var bf = new BinaryFormatter();
var m = new MemoryStream();
Console.WriteLine("Serialize - OK");
var result = (MyDictionary)bf.Deserialize(m);
Console.WriteLine("Deserialize - OK");
foreach (var item in result)
Console.WriteLine("{0} = {1}", item.Key, item.Value);
public class MyDictionary : Dictionary<string, object>, ISerializable
public MyDictionary() { }
protected MyDictionary(SerializationInfo info, StreamingContext context)
throw new ArgumentNullException("info");
int count = info.GetInt32("Count");
for (int i = 0; i < count; i++)
string key = info.GetString(String.Format("ItemKey{0}", i));
object value = info.GetValue(String.Format("ItemValue{0}", i), typeof(object));
public override void GetObjectData(SerializationInfo info, StreamingContext context)
throw new ArgumentNullException("info");
foreach (KeyValuePair<string, object> item in this)
info.AddValue(String.Format("ItemKey{0}", i), item.Key, typeof(string));
info.AddValue(String.Format("ItemValue{0}", i), item.Value);
info.AddValue("Count", this.Count);