【问题标题】:Controlling XML Serialization of a List<> derived class控制 List<> 派生类的 XML 序列化
【发布时间】:2011-06-19 01:13:18
【问题描述】:

我通过以下两个声明将 Dictionary 对象转换为 List 派生类:

[Serializable]
public class LogItem
{
    public string Name { get; set; }
    public string Value { get; set; }

    public LogItem(string key, string value)
    {
        Name = key; Value = value;
    }

    public LogItem() { }
}

public class SerializableDictionary : List<LogItem>
{
    public SerializableDictionary(Dictionary<string, string> table)
    {
        IDictionaryEnumerator index = table.GetEnumerator();
        while (index.MoveNext())
        {
            Put(index.Key.ToString(), index.Value.ToString());
        }
    }

    private void Put(string key, string value)
    {
        base.Add(new LogItem(key, value));
    }
}

我打算通过以下代码序列化SerializableDictionary

SerializableDictionary log = new SerializableDictionary(contents);
using (StringWriter xmlText = new StringWriter())
{
    XmlSerializer xmlFormat =
        new XmlSerializer(typeof(SerializableDictionary), new XmlRootAttribute("Log"));
    xmlFormat.Serialize(xmlText, log);
}

工作正常,但我无法更改 XML 格式。

此 XML 文档旨在发送到 xml 数据库字段,而不是反序列化。

  • 我宁愿同时拥有名称和价值 格式化为的属性 LogItem 元素。

但是,任何使用 XMLAttribute 的尝试都会导致反射或编译错误。我不知道我能做些什么来达到这个要求。有人可以帮忙吗?

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    你可以用XmlAttribute注释它们:

    [Serializable]
    public class LogItem
    {
        [XmlAttribute]
        public string Name { get; set; }
        [XmlAttribute]
        public string Value { get; set; }
    
        public LogItem(string key, string value)
        {
            Name = key; Value = value;
        }
    
        public LogItem() { }
    }
    

    这对我来说很好,并生成了以下 XML(基于示例输入):

    <?xml version="1.0" encoding="utf-16"?>
    <Log xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <LogItem Name="foo" Value="bar" />
      <LogItem Name="asdf" Value="bcxcvxc" />
    </Log>
    

    【讨论】:

    • 天哪!它也对我有用。 Value 属性以前曾被声明为“对象”,那时上述方法不起作用。我刚刚将其更改为字符串,因为我意识到了错误,但从未认为这会改变一切。非常感谢,破碎玻璃
    【解决方案2】:

    除了您所展示的内容之外,肯定还有其他事情正在发生。无论是否将 XmlAttribute 属性应用于 Name 和 Value 属性,我都能够编译和执行上述代码。

    [XmlAttribute]
    public string Name { get; set; }
    [XmlAttribute]
    public string Value { get; set; }
    

    【讨论】:

    • 是的,有 StellarEleven。实际上,我将 LogItem 中的 Value 属性声明为“对象”,这就是我遇到错误并且 XmlAttribute 无法正常工作的时候。然而,我实际上打算将它作为一个字符串,并在发布前几分钟进行了更改。我从来没有测试过,因为我不会想到这个简单的改变会产生如此大的不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多