Eigentlich dachte ich, dass das kein Problem darstellen sollte. Folgende Klasse sollte mit einem BinaryFormatter serialisiert und deserialisieren werden.
using System;
using System.Collections.Generic;
using System.Text;
[Serializable]
public class Content
{
private string m_ID = "";
public string ID
{
get { return m_ID; }
set { m_ID = value; }
}
private string m_ContentText = "";
public string ContentText
{
get { return m_ContentText; }
set { m_ContentText = value; }
}
public Content(string id)
{
this.ID = id;
}
}
[Serializable]
public class Contents : Dictionary<string, Content>
{
public Contents() { }
}
Zum serialisieren und deserialisieren nutze ich folgende zwei Methoden.
private static string SerializeContent(Contents data)
{
byte[] bytes;
using(MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, data);
bytes = ms.GetBuffer();
return Convert.ToBase64String(bytes, 0, bytes.Length, Base64FormattingOptions.None);
}
}
private static Contents DeserializeContent(string data)
{
byte[] bytes = Convert.FromBase64String(data);
using(MemoryStream ms = new MemoryStream(bytes, 0, bytes.Length))
{
BinaryFormatter sf = new BinaryFormatter();
object o = sf.Deserialize(ms);
return (Contents)o;
}
}
Das Objekt Contents konnte ohne Probleme serialisiert werden. Wenn man dann aber das selbe Objekt wieder deserialisieren wollte kam es zu folgender Fehlermeldung:
Der für die Deserialisierung eines Objekts mit dem Typ \"Contents\" erforderliche Konstruktor wurde nicht gefunden.
Wie so konnte man jetzt ein Objekt serialisieren aber nicht mehr deserialisieren? Gute Frage. Lösung habe ich hier gefunden.
Ich musste also die Klasse Contents wie folgt anpassen.
[Serializable]
public class Contents : Dictionary<string, Content>
{
public Contents()
: base() { }
public Contents(SerializationInfo info, StreamingContext context)
: base(info, context) { }
}
Und schon kann man ein Dictionary<TKey, TValue> deserialisieren.