Here's the good news:
yes, you can serialize a dictionary ... unless either the Dictionary Key or Value Types are some strange beast like a WinForm Control. WCF DataContract and DataMember tools are quite powerful; you can even serialize recursive structures.
Here's what the XML produced by serializing a Dictionary<int,List<int>> looks like:
<serializetest xmlns="http://schemas.datacontract.org/2004/07/Dec_8_SDI_App" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><map_list xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:keyvalueofintarrayofintty7ep6d1><a:key>0</a:key><a:value><a:int>1</a:int><a:int>2</a:int><a:int>3</a:int><a:int>4</a:int></a:value></a:keyvalueofintarrayofintty7ep6d1><a:keyvalueofintarrayofintty7ep6d1><a:key>1</a:key><a:value><a:int>5</a:int><a:int>6</a:int><a:int>7</a:int><a:int>8</a:int></a:value></a:keyvalueofintarrayofintty7ep6d1></map_list></serializetest>
Here's the executed code that wrote that Dictionary, and that reads it back in again:
private void button2_Click(object sender, EventArgs e)
{
string filePath = @"C:\Users\YourUserName\Desktop\sTest.xml";
SerializeTest sTest = new SerializeTest();
sTest.Map_list = new Dictionary<int, List<int>>
{
{0, new List<int> {1, 2, 3, 4}},
{1, new List<int> {5, 6, 7, 8}}
};
SerializeTest.Serialize(filePath, sTest);
SerializeTest ReadTest = SerializeTest.DeSerialize(filePath);
}
Here's the Class used to test serializing the Dictionary:
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
namespace YourNameSpace
{
[DataContract]
public class SerializeTest
{
[DataMember]
public Dictionary<int, List<int>> Map_list {set; get;}
public SerializeTest()
{
Map_list = new Dictionary<int, List<int>>();
}
private static DataContractSerializer serializer;
public static void Serialize(string filePath, SerializeTest sTest)
{
serializer = new DataContractSerializer(typeof(SerializeTest));
using (var writer = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
serializer.WriteObject(writer, sTest);
}
}
public static SerializeTest DeSerialize(string filePath)
{
serializer = new DataContractSerializer(typeof(SerializeTest));
SerializeTest serializeTest;
using (var reader = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
serializeTest = serializer.ReadObject(reader) as SerializeTest;
}
return serializeTest;
}
}
}