【问题标题】:XmlSerializer not using XmlRoot defined on classXmlSerializer 不使用类上定义的 XmlRoot
【发布时间】:2016-06-06 15:35:09
【问题描述】:

我正在尝试将自定义类序列化为 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; }

}

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

    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!

【问题讨论】:

    标签: c# xml serialization xmlserializer


    【解决方案1】:

    SerializableKeyValuePair 不是根,List&lt;SerializableKeyValuePair&lt;string, string&gt;&gt; 是!

    我想你在找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 无关。除非您出于其他目的需要它,否则可以将其删除。

    【讨论】:

    • 就是这样!我知道那不是我的根,但文档说我不能在类级别使用 XmlElement,而且我误解了 XmlType 的用途。谢谢你让我直截了当!
    【解决方案2】:

    首先可以尝试在序列化前选择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; }
    }
    

    【讨论】:

    • 感谢您的回复。第一个选项对我来说不可行,第二个不是一个工作示例,因为 Array 类需要知道键和值的数据类型。我真的很想使用现有的序列化技术,但我不明白为什么使用 XmlRoot 至少不能将 变成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多