2016-06-06 16 views
2

Ich versuche, eine benutzerdefinierte Klasse in XML zu serialisieren. Hier ist die Klasse:XmlSerializer nicht mit XmlRoot für die Klasse

[Serializable()] 
[XmlRoot("KVP")] 
public class SerializableKeyValuePair<TKey, TValue> 
{ 

    public SerializableKeyValuePair() 
    { } 

    public SerializableKeyValuePair(TKey key, TValue value) 
    { 
     Key = key; 
     Value = value; 
    } 

    public TKey Key { get; set; } 
    public TValue Value { get; set; } 

} 

Hier ist der Code, der es zu serialisiert versucht:

var xmlWriter = new StringWriter(); 
    Type[] extraTypes = new Type[1] { typeof(SerializableKeyValuePair<string, string>) }; 
    var xmlSerializer = new XmlSerializer(typeof(List<SerializableKeyValuePair<string, string>>), extraTypes); 
    xmlSerializer.Serialize(xmlWriter, functions); 
    xmlRet = xmlWriter.ToString(); 

Und hier ist das tatsächliche Ergebnis:

<ArrayOfSerializableKeyValuePairOfStringString> 
    <SerializableKeyValuePairOfStringString> 
     <Key>Min</Key> 
     <Value>Min</Value> 
    </SerializableKeyValuePairOfStringString> 
    <SerializableKeyValuePairOfStringString> 
     <Key>MinAvgMax</Key> 
     <Value>MinAvgMax</Value> 
    </SerializableKeyValuePairOfStringString> 
</ArrayOfSerializableKeyValuePairOfStringString> 

Was ich würde gerne sehen, ist das Folgende, aber es scheint nicht das von mir definierte XmlRoot zu verwenden. Kann mir jemand helfen, herauszufinden, wie man diese XML-Struktur bekommt?

<ArrayOfKVP> 
    <KVP> 
     <Key>Min</Key> 
     <Value>Min</Value> 
    </KVP> 
    <KVP> 
     <Key>MinAvgMax</Key> 
     <Value>MinAvgMax</Value> 
    </KVP> 
</ArrayOfKVP> 

TIA!

Antwort

1

Aber SerializableKeyValuePair ist nicht die Wurzel, List<SerializableKeyValuePair<string, string>> ist!

Ich glaube, Sie suchen XmlType:

[XmlType("KVP")] 
public class SerializableKeyValuePair<TKey, TValue> 
{ 
    //... 
} 

Und wenn Sie das Element Namen für die Liste ändern möchten, können Sie eine XmlRootAttribute liefern, wenn die Serializer erstellen:

var serializer = new XmlSerializer(typeof(List<SerializableKeyValuePair<string, string>>), 
    null, extraTypes, new XmlRootAttribute("ArrayOfKVP"), string.Empty); 

Nebenbei, Serializable hat nichts mit XmlSerializer zu tun. Sofern Sie es nicht für einen anderen Zweck benötigen, kann es entfernt werden.

+0

Das war es schaffen könnte! Ich wusste, dass das nicht meine Wurzel war, aber die Dokumentation sagte, dass ich XmlElement nicht auf Klassenebene verwenden konnte und ich missverstand, wofür XmlType war. Danke, dass du mich richtig gestellt hast! – VG1

0

Zunächst können Sie versuchen, das Array von KVP vor serializztion

var xKVP = xDoc.Root.Descendants().FirstOrDefault(d => d.Name.LocalName.Equals("car")); 

var serializer = new XmlSerializer(typeof(SerializableKeyValuePair<string, string>)); 
using (var reader = xKVP.CreateReader()) 
{ 
    var result = (SerializableKeyValuePair<string, string>) serializer.Deserialize(reader); 
    Console.WriteLine(result.Key); 
    Console.WriteLine(result.Value); 
} 

Eine andere Möglichkeit, zu wählen, können Sie einen Wrapper für Ihr Array von KVP des

[XmlRoot("ArrayOfKVP")]  
class ArrayOfKVP 
{ 
    public ArrayOfKVP() {} 

    [XmlElement("KVP")] 
    public List<Foo> KVPList {get; set;} 
} 

[Serializable()] 
[XmlType("KVP")] 
public class SerializableKeyValuePair<TKey, TValue> 
{ 

    public SerializableKeyValuePair() 
    { } 

    public SerializableKeyValuePair(TKey key, TValue value) 
    { 
     Key = key; 
     Value = value; 
    } 

    public TKey Key { get; set; } 
    public TValue Value { get; set; } 
} 
+0

Vielen Dank für Ihre Antwort. Die erste Option ist für mich nicht durchführbar und die zweite ist kein funktionierendes Beispiel, da die Array-Klasse die Datentypen des Schlüssels und des Werts kennen müsste. Ich würde gerne die bestehende Serialisierungstechnologie verwenden, aber ich verstehe nicht, warum die Verwendung von XmlRoot nicht funktioniert, um in zu verwandeln. – VG1