これは以前に回答されたことを知っていますが、DataContractSerializer クラス (WCF で使用されますが、どこでも使用できますし、使用する必要があります) を使用して IDictionary シリアル化を行うための非常に簡潔な方法 (コード) があるため、ここで貢献することに抵抗できませんでした:
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 (Windows Phone 7 の NETCF 3.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 である可能性があります。
それが誰かを助けることを願っています!