【问题标题】:Using XML decorations to specify default values during de-serialization在反序列化期间使用 XML 装饰指定默认值
【发布时间】:2011-03-30 08:49:09
【问题描述】:

我在反序列化某些 XML 时遇到问题;第三方提供的 XML 非常冗长,因此如果没有为特定元素设置值,它将提供并清空元素(例如 <element1 />)。

这对于某些元素来说是个问题,例如那些用于存储整数的元素。我可以控制第三方,所以我可以让他们指定默认值 (<myinteger>0</myinteger>),或者我可以让他们完全忽略这些元素。这两个都应该避免这个问题。

但是,将来可能会出现我们没有太多控制权的情况 - 在这种情况下,是否有办法指定(可能通过装饰)默认值?

    [XmlElement("myinteger")=0???]
    public int MyInteger
    {
        get
        {
            return myInteger;
        }
        set
        {
            myInteger= value;
        }
    }

【问题讨论】:

    标签: c# serialization xml-serialization default-value xml-deserialization


    【解决方案1】:

    XmlSerializer 确实支持[DefaultValue],但它在序列化期间使用它。在反序列化期间,它只是简单地运行构造函数,然后获取传入的值并应用它们。那么,一种常见的方法是使用构造函数(或字段初始化器):

    public Foo() {
        Bar = 4;
    }
    [DefaultValue(4), XmlAttribute("bar")]
    public int Bar {get;set;}
    

    然而; XmlSerializer 对此的解释不是“提供一个空元素”——而是“省略元素(/属性)”。即使int? 也不会映射到“空”。要处理 empty 元素,您必须将其作为字符串处理。这很丑。

    【讨论】:

    • 嗯...简单地让第三方省略描述的空元素似乎是最简单的解决方案。我只是好奇在没有这种选择的情况下我能做什么。我确实考虑了字符串选项,但它只是一大堆蠕虫......
    • 反序列化过程中至少有一个重要作用。如果元素为空,没有 DefaultValue 可能会出现解析错误。但是,有了它,generated code 将跳过空元素。
    【解决方案2】:

    使用 [DefaultValue] 进行装饰似乎不是完整的解决方案,因为它并不总是有效。另一个简单的解决方案(可能不干净)

    public string _sourceSubFolderName;
        [DefaultValueAttribute("")]
        [XmlElement("SourceSubFolderName")]
        public string SourceSubFolderName
        {
            get { return string.IsNullOrEmpty(_sourceSubFolderName) ? 
                   string.Empty : _sourceSubFolderName; }
            set { _sourceSubFolderName = value; }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多