Serialize Dictionary <string, string> -Mitglied für XML-Elemente und -Daten

Ich habe eine Klasse 'Produkte', die in XML serialisierbar ist. Ich verwende den Standard-System.Xml.Serialization.XmlSerializer zum Serialisieren und ein XmlWriter-Writer-Objekt zum Schreiben der serialisierten Ergebnisse in ein StreamWriter-Objekt. Das serializer-Objekt serialisiert jetzt die gesamte Klasse auf einmal:

XmlSerializer serializer = new XmlSerializer(typeof(products));
serializer.Serialize(writer, products);

Die Klasse hat ein Dictionary-Mitglied <string, string> mit dem Namen 'Specifications'. Es ist dynamisch aufgebaut, daher kenne ich die Schlüssel vorher nicht. Hier ist ein Beispiel dafür, welche Daten das Wörterbuch enthalten kann (Schlüssel: Wert):

Farbe bla Länge: 110 mm width: 55mm

Ich möchte in der Lage sein, diese Eigenschaft in diese zu serialisieren:

...
<specifications>
  <color>blue</color>
  <length>110mm</length>
  <width>55mm</width>
</specifications>
...

ch weiß, dass dies ein schlechtes XML-Design ist, aber es muss einer Spezifikation eines Drittanbieters entspreche

Gibt es vielleicht ein Standardattribut, das ich verwenden kann? Wenn nicht, wie könnte ich das Wörterbuch dann so serialisieren?

Wenn Sie weitere Codefragmente benötigen, lassen Sie es mich wissen.

BEARBEITE: Aufgrund einiger Änderungen in den Anforderungen habe ich das Dictionary <string, string> losgelassen. Stattdessen habe ich eine Klasse "Spezifikation" erstellt:

public class Specification
{
    public string Name;
    public string Value;
    public bool IsOther;

    public Specification() : this(null, null, false) { }

    public Specification(string name, string value) : this(name, value, false) { }

    public Specification(string name, string value, bool isOther)
    {
        Name = name;
        Value = value;
        IsOther = isOther;
    }
}

Um zu vermeiden, dass das Element "spec" wiederholt wird, indem eine Liste mit "Specification" in der Produktklasse vorhanden ist, verwende ich eine Plural-Klasse "Specifications", die die IXmlSerializable-Schnittstelle implementiert:

public class Specifications: IXmlSerializable
{
    public List<Specification> Specs = new List<Specification>();

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        //I don't need deserialization, but it would be simple enough now.
        throw new System.NotImplementedException();
    }

    public void WriteXml(XmlWriter writer)
    {
        //write all "standarad", named specs
        //this writes the <color>blue</color>-like elements
        Specs.Where(s => !s.IsOther).ToList().ForEach(s => writer.WriteElementString(s.Name, s.Value));

        //write other specs
        //this writes <other_specs>{name|value[;]}*</other_specs>
        string otherSpecs = string.Join(";", Specs.Where(s => s.IsOther).Select(s => string.Concat(s.Name, "|", s.Value)));
        if (otherSpecs.Length > 0) writer.WriteElementString("other_specs", otherSpecs);
    }
}

Die Klasse "Technische Daten" wird angewendet als:

public class Product
{
    public Product()
    {
        Specifications = new Specifications();
    }

    [XmlElement("specs")]
    public Specifications Specifications;

    //this "feature" will not include <specs/> when there are none
    [XmlIgnore]
    public bool SpecificationsSpecified { get { return Specifications.Specs.Any(); } }

    //...
}

Vielen Dank, dass Sie Beispiele für IXmlSerializable und XmlWriter bereitgestellt haben. Ich kannte diese Benutzeroberfläche und die Verwendung von XmlWriter nicht - es erwies sich als wertvolle Inspiration für mich!

* das war meine erste SO frage. Was ist der am besten geeignete Weg, um es zu schließen? Ich habe dies nicht als meine eigene Antwort angegeben, da dies keine echte Antwort auf meine ursprüngliche Frage (zum Wörterbuch) ist.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage