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.Dictionary
2[[System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary
2[[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?
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 🙂
Finde ich nicht.
Ich erzeuge lediglich eine neue Instanz eines XML Serialisierers und sage ihm welche Art er serialisieren soll.
Ö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 🙂
Mit ner normalen Arraylist geht das, habe schon schon getestet...
aber mit den verschlachtelten Dictionary?
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 🙂
Au au au ...jetzt wirds aber kompliziert...vielen Dank, werde mich mal einlesen.
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 🙂
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
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 🙂
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
Hallo bernett,
laut MSDN existiert die DataContractJsonSerializer-Klasse auch in .NET 3.5. Hast du das SP1 installiert?
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Dankeschön, habs grade gefunden gehabt.
System.ServiceModel.Web.dll
Wäre es gewesen! 😃
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