52 Stimmen

Warum unterstützt der XmlSerializer kein Dictionary?

Ich bin nur neugierig, warum Dictionary nicht unterstützt wird von XmlSerializer ?

Sie können das Problem leicht umgehen, indem Sie DataContractSerializer und das Schreiben des Objekts in eine XmlTextWriter Was sind die Merkmale eines Wörterbuchs, die es für ein Unternehmen schwierig machen, eine XmlSerializer wenn man bedenkt, dass es sich eigentlich um ein Array von KeyValuePairs handelt.

In der Tat können Sie eine IDictionary<TKey, TItem> zu einer Methode, die eine IEnumerable<KeyValuePairs<TKey, ITem>> .

33voto

leppie Punkte 111830

Hashtabellen benötigen generell Hashcode- und Gleichheitsvergleichsanbieter. Diese können nicht einfach in XML serialisiert werden und werden definitiv nicht portabel sein.

Aber ich denke, Sie haben Ihre Antwort bereits gefunden. Serialisieren Sie einfach die Hashtabelle als List<KeyValuePair<K,V>> und dann in eine Hashtabelle (um)konstruieren.

4 Stimmen

4 Stimmen

Welche Methoden/Eigenschaften von Dictionary implizieren, dass es als Hashtabelle implementiert werden muss? Dictionary und IDictionary sind Sammlungen von Key/Value-Paaren und unterscheiden sich von der Hashtable-Implementierung. Aus Sicht der Serialisierung scheint es unser Ziel zu sein, Daten aus dem flüchtigen Speicher zu nehmen, um sie zu einem späteren Zeitpunkt wieder hineinzuladen. Nachladen jede Daten in eine andere konkrete Implementierung einer Schnittstelle zu übertragen, wird zu einem anderen Verhalten führen.

5 Stimmen

Die Serialisierung von KeyValuePair funktioniert nicht. Sie werden mit einem leeren Tag enden. Siehe: stackoverflow.com/questions/2658916/

7voto

Nich Overend Punkte 782

Ich bin zwar viel zu spät dran, aber ich habe diese Frage gefunden, als ich selbst nach der Antwort suchte, und dachte, ich teile meine Antwort mit, die darin bestand, die XmlSerializer mit einem anderen Tool, das alles serialisiert:

http://www.sharpserializer.com

Es funktionierte für mich direkt aus der Box, Serialisierung Dictionaries und mehrschichtige benutzerdefinierte Typen, und sogar Generika mit Schnittstellen als Typ Argumente. Auch hat eine vollständig permissive Lizenz.

Vielen Dank, Pawel Idzikowski!

4 Stimmen

DataContractSerializer serialisiert auch Dictionaries und ist jetzt Teil des .NET Frameworks.

3voto

Wojtpl2 Punkte 548

Sie können verwenden ExtendedXmlSerializer . Wenn Sie eine Klasse haben:

public class TestClass
{
    public Dictionary<int, string> Dictionary { get; set; }
}

und erstellen Sie eine Instanz dieser Klasse:

var obj = new TestClass
{
    Dictionary = new Dictionary<int, string>
    {
        {1, "First"},
        {2, "Second"},
        {3, "Other"},
    }
};

Sie können dieses Objekt mit ExtendedXmlSerializer serialisieren:

var serializer = new ConfigurationContainer()
    .UseOptimizedNamespaces() //If you want to have all namespaces in root element
    .Create();

var xml = serializer.Serialize(
    new XmlWriterSettings { Indent = true }, //If you want to formated xml
    obj);

Die Ausgabe der xml-Datei wird wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?>
<TestClass xmlns:sys="https://extendedxmlserializer.github.io/system" xmlns:exs="https://extendedxmlserializer.github.io/v2" xmlns="clr-namespace:ExtendedXmlSerializer.Samples;assembly=ExtendedXmlSerializer.Samples">
  <Dictionary>
    <sys:Item>
      <Key>1</Key>
      <Value>First</Value>
    </sys:Item>
    <sys:Item>
      <Key>2</Key>
      <Value>Second</Value>
    </sys:Item>
    <sys:Item>
      <Key>3</Key>
      <Value>Other</Value>
    </sys:Item>
  </Dictionary>
</TestClass>

Sie können ExtendedXmlSerializer installieren von nuget oder führen Sie den folgenden Befehl aus:

Install-Package ExtendedXmlSerializer

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X