niz*_*ize 5 xml wcf nullable jaxb minoccurs
XML解析器/反序列化器通常能够区分显式设置为null的可枚举元素和省略的可选元素吗?
假设我们有以下复杂类型:
<complexType name="NiceType">
<sequence>
<element name="niceElem" nillable="true" type="int" minOccurs="0" />
</sequence>
</complexType>
Run Code Online (Sandbox Code Playgroud)
元素显式设置为null(示例1):
<niceType>
<niceElem xsi:nil="true"/>
</niceType>
Run Code Online (Sandbox Code Playgroud)
元素省略(例2):
<niceType>
</niceType>
Run Code Online (Sandbox Code Playgroud)
一般的解析器,例如JAX-B实现或.NET等,例如WCF的XML模块,是否能够分辨上面的示例1和示例2之间的区别?换句话说,您是否能够以可互操作的方式组合两个NULL表示 - 如示例中所示 - 以便传达不同的NULL阴影?
XML 解析器(例如XmlReader
、XmlDocument
、XDocument
)不会进行xsi:nil
特殊处理 - 您仍然可以在流/文档中看到该元素。
XmlSerializer
确实处理xsi:nil
:在该上下文中,它与省略的节点含义相同;您可以XmlSerializer
通过使用 标记您的DataContract
s来使 WCF 序列化XmlSerializerFormatterAttribute
。
DataContractSerializer
确实使用该属性:但是我不确定使用它们的所有规则是什么(一种情况是循环引用) - 它更有可能省略元素。我认为你不应该传递xsi:nil
给DataContractSerializer
除非它在这种情况下使用它 - 正如DataContractSerializer
围绕提高反/序列化性能的假设而设计的。
从规范来看,它最初被设计为像 JavaScript 一样工作null
,并且undefined
- 其中null
( xsi:nil
) 是一个有效值,而undefined
(省略)是一个值完全不存在;特别是对于复杂类型 - 您可以提供元素但省略其内容(即使根据架构需要该内容)。
一般来说我会避免它。它不直观——我认为我还没有见过使用它的 REST/SOAP API(除了专门使用它的 InfoPath);大多数只是使用null = undefined
。它的 xmlns 声明和使用也消耗了一些额外的有价值的字节。
加分项:如果您将某个元素设置为可选且不可为空(例如xsd:int
),C# 生成器会提供一个<Name>Specified
属性 - 您可以像这样添加自己的属性。这将允许您区分xsi:nil
和 省略(指定时为 nil,未指定时为 null,省略)。但是,这仅适用于XmlSerializer
.
归档时间: |
|
查看次数: |
3551 次 |
最近记录: |