Laden...

XMLSerializer und verschachteltes Dictionary

Erstellt von schuppsl vor 15 Jahren Letzter Beitrag vor 13 Jahren 9.779 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 15 Jahren
XMLSerializer und verschachteltes Dictionary

Hallo.

Ich habe ein verschachteltes Dictionary, das sieht so aus:


 Dictionary<Guid, Dictionary<string,string>> dic = new Dictionary<Guid, Dictionary<string,string>>();

Im Anschluß habe ich dieses Objekt gefüllt und möchte es nun serialisieren:



                    XmlSerializer xs = new XmlSerializer(typeof(Dictionary<Guid, Dictionary<string,string>>));
                       StringWriter wr = new StringWriter();

                       xs.Serialize(wr, dic);

                       Session.Add("data", wr);
                       wr.Close();


Beim kompilieren meckert er noch nicht, aber zur Laufzeit kommt die Meldung:

Der Typ "System.Collections.Generic.Dictionary2[[System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] wird nicht unterstützt, da er IDictionary implementiert.

Diese Meldung verstehe ich nicht.
Kann ich das so gar nicht serialisieren?

R
258 Beiträge seit 2007
vor 15 Jahren

Abgesehen davon, dass es zur Laufzeit nicht funktioniert, ist

XmlSerializer xs = new XmlSerializer(typeof(Dictionary<Guid, Dictionary<string, string>>));

denn nicht eine etwas kranke Codezeile?

Mach da mal n halbes Jahr später ne Änderung am Programm, da brauchste ja ne Woche, um da wieder durchzublicken. Meine 3-fach geschachtelten foreach-Schleifen sind ja schon ein Verbrechen, aber DAS oO

mfg, Rasta

Sogar meine Mailadresse ist .NET 🙂

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 15 Jahren

Finde ich nicht.
Ich erzeuge lediglich eine neue Instanz eines XML Serialisierers und sage ihm welche Art er serialisieren soll.

R
258 Beiträge seit 2007
vor 15 Jahren

Öhm, stimmt ja, ich hab das "typeof" überlesen 🙂

Ich hab gedacht, du übergibst im Konstruktor 2 geschachtelte Dictionarys.

Rein interessehalber: lässt sich so ein XML dann später noch lesen?
Ich hab selbst noch nie serialisiert, ging alles mit kleinen XML Files oder sowas...

Sogar meine Mailadresse ist .NET 🙂

Gelöschter Account
vor 15 Jahren

Rein interessehalber: lässt sich so ein XML dann später noch lesen?

ja.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 15 Jahren

Mit ner normalen Arraylist geht das, habe schon schon getestet...
aber mit den verschlachtelten Dictionary?

R
258 Beiträge seit 2007
vor 15 Jahren

Zitat MSDN: "Klassen, die IEnumerable oder ICollection implementieren, werden von XmlSerializer besonders behandelt. Eine Klasse, die IEnumerable implementiert, muss eine öffentliche Add-Methode mit einem einzigen Parameter implementieren. Der Parameter der Add-Methode muss von demselben Typ sein, den die Current-Eigenschaft für den von GetEnumerator zurückgegebenen Wert zurückgibt, oder muss ein Basistyp dieses Typs sein. Eine Klasse, die ICollection zusätzlich zu IEnumerable implementiert, z. B. CollectionBase, muss eine öffentliche und mit Item indizierte (Indexer in C#) Eigenschaft mit einer ganzen Zahl sowie eine öffentliche Count-Eigenschaft vom Typ Integer aufweisen. Der Parameter der Add-Methode muss von demselben Typ sein, den die Item-Eigenschaft zurückgibt, oder muss ein Basistyp dieses Typs sein. Bei Klassen, die ICollection implementieren, werden die zu serialisierenden Werte nicht durch einen Aufruf von GetEnumerator, sondern über die indizierte Item-Eigenschaft abgerufen."

Die Sache ist die, dass bei Objekten, die IDictionary implementieren, der Serializer Mist baut. Lösung: http://www.mattberther.com/2004/06/14/serializing-an-idictionary-object/

Google Suche, Stichwort: "IDictionary XMLSerializer", 1 Minute. GidF 🙂

EDIT: Etwas einfacher verständlich: http://msmvps.com/blogs/rakeshrajan/archive/2006/01/15/81105.aspx

mfg, Rasta

Sogar meine Mailadresse ist .NET 🙂

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 15 Jahren

Au au au ...jetzt wirds aber kompliziert...vielen Dank, werde mich mal einlesen.

R
258 Beiträge seit 2007
vor 15 Jahren

Viel lesen musst du da nicht, sind ja Codebeispiele drin (ka, wie viel die dir nützen, aber vllt kannst du ja einfach copypasten und das läuft 🙂).

Sogar meine Mailadresse ist .NET 🙂

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo schuppsl,

auch wenn du dazu aufgefordert wirst: Erstelle keine Crossposts! Du sieht ja, was passiert. Es wird dann in beiden Threads weiterdiskutiert. Also: Nie Crossposts erstellen. Bitte stattdessen einen Moderator darum, dass er deinen Beitrag abteilt ... oder noch besser. Erst gar nicht in einem Thread zu einem Thema ein neues Thema anfragen, das da nicht reingehört.

==> Threads zusammengefügt und bereinigt

herbivore

R
258 Beiträge seit 2007
vor 15 Jahren

OT: Genau deshalb hasse ich Leute, die mit Paragraphen um sich werfen (Die Person fühlt sich jetzt hoffentlich angesprochen)...

@ schuppsl: Bitte ERgebnisse posten, falls du die Lösung hast, mich würde das nämlich auch interessieren(und vllt noch andere).

mfg, Rasta

Sogar meine Mailadresse ist .NET 🙂

B
53 Beiträge seit 2006
vor 13 Jahren

Ziemlich alt der Thread, aber evtl. interessiert es ja wen. Unter .NET 4.0 klappt es zumindest mit dem JSON-Serializer.


MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(PersonDict));
ser.WriteObject(stream1, personDict);

stream1.Position = 0;
StreamReader sr = new StreamReader(stream1);
string jSonContent = sr.ReadToEnd();

Da ich aber auf .NET 3.5 gefangen bin aktuell, hat wer eine Lösung dafür gefunden? JSON funktioniert wie ich es sehe wohl wirklich nur mit 4.0. 😦

Grüße,
bernett

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo bernett,

laut MSDN existiert die DataContractJsonSerializer-Klasse auch in .NET 3.5. Hast du das SP1 installiert?

zero_x

B
53 Beiträge seit 2006
vor 13 Jahren

Dankeschön, habs grade gefunden gehabt.

System.ServiceModel.Web.dll

Wäre es gewesen! 😃

0
767 Beiträge seit 2005
vor 13 Jahren

Du kannst statt Dictionary<TKey, TItem> eine Ableitung von KeyedCollection<TItem> machen. Die ist dann serialisierbar, und hat auch schnellen Zugriff über den Key.

loop:
btst #6,$bfe001
bne.s loop
rts