using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class SerializableDictionary<K,V>
{
[Serializable]
private struct Pair
{
public K Key { get; set; }
public V Value { get; set; }
}
private Pair[] _pairs;
private SerializableDictionary() { }
public static explicit operator Dictionary<K, V>(SerializableDictionary<K, V> from)
{
if (from == null) throw new ArgumentNullException("SerializableDictionary.explicit from");
Dictionary<K, V> res = new Dictionary<K, V>();
from._pairs.Select(p => res[p.Key] = p.Value).ToArray();
return res;
}
public static explicit operator SerializableDictionary<K, V>(Dictionary<K, V> from)
{
if (from == null) throw new ArgumentNullException("SerializableDictionary.explicit from");
SerializableDictionary<K, V> sd = new SerializableDictionary<K, V>()
{
_pairs = from.Select(p => new Pair(){Key = p.Key, Value = p.Value}).ToArray()
};
return sd;
}
public void example()
{
Dictionary<int, string> source = new Dictionary<int, string>();
byte[] dest = ((SerializableDictionary<int, string>)source).Serialize();
source = (Dictionary<int, string>)(dest.Deserialize<int, string>());
}
}
public static class Helpers
{
public static byte[] Serialize<K,V>(this SerializableDictionary<K, V> from)
{
if (from == null) throw new ArgumentNullException("SerializableDictionary.Serialize from");
byte[] res;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter f = new BinaryFormatter();
f.Serialize(ms, from);
res = ms.ToArray();
ms.Close();
}
return res;
}
public static SerializableDictionary<K, V> Deserialize<K,V>(this byte[] from)
{
if (from == null) throw new ArgumentNullException("SerializableDictionary.Deserialize from");
SerializableDictionary<K, V> to;
using (MemoryStream ms = new MemoryStream(from))
{
BinaryFormatter f = new BinaryFormatter();
to = (SerializableDictionary<K, V>)f.Deserialize(ms);
ms.Close();
}
return to;
}
}