在反序列化期间使用 XML 装饰指定默认值

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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; 
    

【讨论】:

以上是关于在反序列化期间使用 XML 装饰指定默认值的主要内容,如果未能解决你的问题,请参考以下文章

在反序列化期间获取任何深度的XMLElement

用于在反序列化期间忽略未知属性的 SpringMVC 全局设置

Django REST Framework 序列化程序字段必需=false

XML反序列化处理具有默认值的空标签

使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

JsonSerializer 在反序列化期间不使用内部构造函数