XmlSerializer
does not support Dictionary serialization directly, but we can define set of helper methods to save it as a list and later retrieve it to a dictionary, here is an example using extension methods and a data holder class Entry
public static class Helper
{
public static void Load<TK, TV>(this Dictionary<TK, TV> dic, Stream stream)
{
var reader = new XmlSerializer(typeof (List<Entry<TK, TV>>));
var list = (List<Entry<TK, TV>>)reader.Deserialize(stream);
foreach(var l in list)
dic.Add(l.Key,l.Value);
}
public static void Save<TK, TV>(this Dictionary<TK, TV> dic, Stream stream)
{
var list = new List<Entry<TK, TV>>();
foreach (var pair in dic)
list.Add(new Entry<TK, TV> {Key = pair.Key, Value = pair.Value});
var writer = new XmlSerializer(typeof(List<Entry<TK, TV>>));
writer.Serialize(stream, list);
}
public static void Load<TK, TV>(this Dictionary<TK, TV> dic, string path)
{
using(var f=File.OpenRead(path))
Load(dic,f);
}
public static void Save<TK, TV>(this Dictionary<TK, TV> dic, string path)
{
using (var f = File.OpenWrite(path))
Save(dic, f);
}
}
public class Entry<TK, TV>
{
[XmlAttribute]
public TK Key { get; set; }
public TV Value { get; set; }
}
and here is an usage example:
public class Student
{
public string ime { get; set; }
public string prezime { get; set; }
public DateTime datumRodjenja { get; set; }
public string mestoRodjenja { get; set; }
public string JMBG { get; set; }
public string brojIndeksa { get; set; }
public string adresa { get; set; }
public string grad { get; set; }
public string brojTelefona { get; set; }
public string brojMobilnog { get; set; }
}
class Program
{
static void Main(string[] args)
{
var dic=new Dictionary<string,Student>();
var student1 = new Student
{
adresa = "adresa",
JMBG = "1234",
prezime = "prezime",
datumRodjenja = DateTime.Now
};
var student2= new Student
{
adresa = "adresa",
JMBG = "4567",
prezime = "prezime",
datumRodjenja = DateTime.Now
};
dic.Add(student1.JMBG,student1);
dic.Add(student2.JMBG,student2);
dic.Save("test.xml"); //save sample
dic.Clear();
dic.Load("test.xml"); //load sample
var student3 = new Student
{
adresa = "adresa",
JMBG = "9012",
prezime = "prezime",
datumRodjenja = DateTime.Now
};
dic.Add(student3.JMBG,student3); //adding new student
dic.Save("test.xml"); //saving again to add recently added student
}
and final test.xml is:
<?xml version="1.0"?>
<ArrayOfEntryOfStringStudent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<EntryOfStringStudent Key="1234">
<Value>
<prezime>prezime</prezime>
<datumRodjenja>2015-09-10T23:19:20.6226745+04:30</datumRodjenja>
<JMBG>1234</JMBG>
<adresa>adresa</adresa>
</Value>
</EntryOfStringStudent>
<EntryOfStringStudent Key="4567">
<Value>
<prezime>prezime</prezime>
<datumRodjenja>2015-09-10T23:19:20.6266749+04:30</datumRodjenja>
<JMBG>4567</JMBG>
<adresa>adresa</adresa>
</Value>
</EntryOfStringStudent>
<EntryOfStringStudent Key="9012">
<Value>
<prezime>prezime</prezime>
<datumRodjenja>2015-09-10T23:19:20.722681+04:30</datumRodjenja>
<JMBG>9012</JMBG>
<adresa>adresa</adresa>
</Value>
</EntryOfStringStudent>
</ArrayOfEntryOfStringStudent>