XmlSerializer 不使用 class 上定义的 XmlRoot

XmlSerializer not using XmlRoot defined on class

我正在尝试将自定义 class 序列化为 XML。这是 class:

[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; }

}

这是尝试序列化它的代码:

    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();

这是实际结果:

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

我想看的是下面的,但是好像没有使用我定义的XmlRoot。谁能帮我弄清楚如何获得这个 XML 结构?

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

TIA!

但是 SerializableKeyValuePair 不是根,List<SerializableKeyValuePair<string, string>> 是!

我想你在找 XmlType:

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

如果您想更改列表的元素名称,可以在创建序列化程序时提供 XmlRootAttribute

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

顺便说一句,SerializableXmlSerializer无关。除非您出于其他目的需要它,否则可以将其删除。

首先可以尝试select序列化之前的KVP数组

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);
}

另一种方式,您可以为您的 KVP 数组创建一个包装器

[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; }
}