Я знаю, что на этот вопрос уже отвечали ранее, но, поскольку у меня есть очень лаконичный способ (код) для выполнения сериализации IDictionary с классом DataContractSerializer (используется WCF, но может и должен использоваться где угодно), я не смог удержаться от его внесения здесь:
public static class SerializationExtensions
{
public static string Serialize<T>(this T obj)
{
var serializer = new DataContractSerializer(obj.GetType());
using (var writer = new StringWriter())
using (var stm = new XmlTextWriter(writer))
{
serializer.WriteObject(stm, obj);
return writer.ToString();
}
}
public static T Deserialize<T>(this string serialized)
{
var serializer = new DataContractSerializer(typeof(T));
using (var reader = new StringReader(serialized))
using (var stm = new XmlTextReader(reader))
{
return (T)serializer.ReadObject(stm);
}
}
}
Это прекрасно работает в .NET 4 и должно работать в .NET 3.5, хотя я еще не тестировал его.
ОБНОВЛЕНИЕ: Это не не работает в .NET Compact Framework (даже не NETCF 3.7 для Windows Phone 7), так как DataContractSerializer
не поддерживается!
Я выполнил потоковую передачу на строку, потому что это было более удобно для меня, хотя я мог бы ввести сериализацию более низкого уровня в Stream и затем использовать ее для сериализации в строки, но я склонен обобщать только при необходимости (как преждевременный оптимизация это зло, поэтому это преждевременное обобщение ...)
Использование очень просто:
// dictionary to serialize to string
Dictionary<string, object> myDict = new Dictionary<string, object>();
// add items to the dictionary...
myDict.Add(...);
// serialization is straight-forward
string serialized = myDict.Serialize();
...
// deserialization is just as simple
Dictionary<string, object> myDictCopy =
serialized.Deserialize<Dictionary<string,object>>();
myDictCopy будет дословной копией myDict.
Вы также заметите, что предоставленные универсальные методы смогут сериализовать любой тип (насколько мне известно), поскольку он не ограничивается интерфейсами IDictionary, это может быть действительно любой универсальный тип T.
Надеюсь, это кому-нибудь поможет!