C# XmlSerializer未使用类上定义的XmlRoot

C# XmlSerializer未使用类上定义的XmlRoot,c#,xml,serialization,xmlserializer,C#,Xml,Serialization,Xmlserializer,我正在尝试将自定义类序列化为XML。下面是课堂: [Serializable()] [XmlRoot("KVP")] public class SerializableKeyValuePair<TKey, TValue> { public SerializableKeyValuePair() { } public SerializableKeyValuePair(TKey key, TValue value) { Key = key

我正在尝试将自定义类序列化为XML。下面是课堂:

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

}
[Serializable()]
[XmlRoot(“KVP”)]
公共类SerializableKeyValuePair
{
public SerializableKeyValuePair()
{ }
public SerializableKeyValuePair(TKey-key,TValue-value)
{
钥匙=钥匙;
价值=价值;
}
公钥{get;set;}
公共TValue值{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();
var xmlWriter=new StringWriter();
Type[]extraTypes=新类型[1]{typeof(SerializableKeyValuePair)};
var xmlSerializer=新的xmlSerializer(typeof(List),extraTypes);
序列化(xmlWriter,函数);
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>

分钟
分钟
米纳夫格马克斯
米纳夫格马克斯

蒂亚

但是
SerializableKeyValuePair
不是根,
List

我想你在寻找:


另一方面,
Serializable
XmlSerializer
无关。除非您出于其他目的需要它,否则可以将其删除。

首先,您可以在序列化之前尝试选择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);
}
var xKVP=xDoc.Root.subjections().FirstOrDefault(d=>d.Name.LocalName.Equals(“car”);
var serializer=新的XmlSerializer(typeof(SerializableKeyValuePair));
使用(var reader=xKVP.CreateReader())
{
var result=(SerializableKeyValuePair)序列化程序。反序列化(读取器);
控制台写入线(结果键);
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; }
}
[XmlRoot(“ArrayOfKVP”)]
类ArrayOfKVP
{
公共数组fkvp(){}
[XmlElement(“KVP”)]
公共列表KVPList{get;set;}
}
[可序列化()]
[XmlType(“KVP”)]
公共类SerializableKeyValuePair
{
public SerializableKeyValuePair()
{ }
public SerializableKeyValuePair(TKey-key,TValue-value)
{
钥匙=钥匙;
价值=价值;
}
公钥{get;set;}
公共TValue值{get;set;}
}

感谢您的回复。第一个选项对我来说是不可行的,第二个不是有效的示例,因为数组类需要知道key&value的数据类型。我真的很想使用现有的序列化技术,但我不明白为什么使用XmlRoot至少在转换为时不起作用。就是这样!我知道这不是我的根,但文档说我不能在类级别使用XmlElement,我误解了XmlType的用途。谢谢你让我明白过来!
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);
}
[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; }
}