Feed
Google+
Contact
XING
LinkedIn
Twitter
ICQ
meebo.com

Dictionary mit einem BinaryFormatter serialisieren

by Roland Schumacher alias GENiALi 19. Februar 2009 -- 208 words  -- 232 mal gelesen

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.

Tags:

Entwicklung

Kommentar schreiben

  Country flag

biuquote
  • Kommentar
  • Live Vorschau
Loading

Statistik

Gesamte Posts: 1025
Dieses Jahr: 7
Diesen Monat: 1
Diese Woche: 0
Kommentare: 929
Total Bewertungen: 91
Ø Bewertung: 4,42
Meisten Kommentare
Google+ ... (28)
Beste Ø Bewertung
Tastaturlayout von Visual Stud ... (5)
Meiste Bewertungen
Windows 7 und die ersten Erfah ... (5)

Buttons

Stop Spam Harvesters, Join Project Honey Pot Benutzerprofil von GENiALi connection speed test network connection Bloggeramt.de Slug.ch Blog Verzeichnis und Blog Webkatalog Schumacher Roland Seitwert Valid XHTML 1.0 Transitional

writing