在反序列化期间使用 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 装饰指定默认值的主要内容,如果未能解决你的问题,请参考以下文章
用于在反序列化期间忽略未知属性的 SpringMVC 全局设置
Django REST Framework 序列化程序字段必需=false