XMLSerializer und ein geschachteltes Dictionary in C#

XMLSerializer und ein geschachteltes Dictionary in C#

Xml ist so eine Sache.. etwas geschwätzig, und recht viel tippen muß ich auch, wenn ich es manuell erzeuge.

Xml, COM, Javascript, Html5.. bei einigen Dingen habe ich nie so richtig verstanden, warum sie sich durchsetzen und besser sind als die Konkurrenz.

Doch konkret: Ich wollte ein Dictionary serialisieren und einmal die JSON- mit der XML-Ausgabe vergleichen.

Doch das, was in JSON mit dem Javascriptserializer ein Zweizeiler ist, ist mit XML dann doch etwas aufwendiger.

Hier die Datentypen:

1
var allDict = new Dictionary<string, Dictionary<string, List<string>>>();

Mit JSON sieht es sehr einfach aus:

1
2
3
4
var js = new JavaScriptSerializer();
js.MaxJsonLength = (int)1E+7;
var res = js.Serialize(allDict);
File.WriteAllText(@"C:\temp\res.json", res);

Nach etwas Suchen habe ich dann die passende Datenstruktur sowie den passenden Linq gefunden, der aus dem geschachtelten Dictionary eine geschachtelte Liste macht.

1
2
3
4
5
6
7
// xml can't serialize Dictionary, convert to list
var xmls = new System.Xml.Serialization.XmlSerializer(typeof(List<KeyValuePair<string, List<KeyValuePair<string, List<string>>>>>));
var tempObj1 = allDict.ToList();
var tempObj = tempObj1.Select(dict => new KeyValuePair<string, List<KeyValuePair<string, List<string>>>>(dict.Key, dict.Value.Select(d => new KeyValuePair<string, List<string>>(d.Key, d.Value)).ToList())).ToList();
TextWriter ws = new StreamWriter(@"c:\temp\res.xml");
xmls.Serialize(ws, tempObj);
ws.Close();

Das Ergebnis-Xml war ca. 4x so groß wie das Ergebnis-JSON und sah dann ungefähr so aus:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfKeyValuePairOfStringListOfKeyValuePairOfStringListOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <KeyValuePairOfStringListOfKeyValuePairOfStringListOfString>
    <Value>
      <KeyValuePairOfStringListOfString>
        <Value>
          <string>

Einer von mehreren Fehlern, die ich bekommen hatte, war

„error CS1922: Cannot initialize type ‚System.Collections.Generic.KeyValuePair>>>‘ with a collection initializer because it does not implement ‚System.Collections.IEnumerable’”

Vielleicht hilft dies und Google ja noch dem einen oder anderen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.