.net - 与 nillable 属性相关的 XML 序列化变化
问题描述
我想知道是否有人知道点网库中的一些变化,这会导致对 nillable 元素进行不同的序列化方式。三个月前,我们的系统正在生成这种元素,以防相关属性为空:
<LatinFirstName />
此元素的 XSD 如下所示:
<xsd:element name="LatinFirstName" minOccurs="0"
nillable="true">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="70"></xsd:maxLength>
<xsd:pattern
value="["\\/\(\)\-'\.,_:a-zA-Z]+">
</xsd:pattern>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
然而,有些事情发生了变化,系统目前正在同一个地方产生这个:
<LatinFirstName p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance"/>
我试图找出导致这种变化的原因以及如何解决它的潜在方法。
解决方案
我假设这发生在您重建代码之后,行为不会随着 .net 更新而改变。所以问题是导致这种情况的构建之间发生了什么变化。
但是查看您的 xml 架构定义,“新”输出的格式正确。在针对架构进行验证时,“旧”输出将无效。
当您序列化一个对象时,序列化程序会检查属性是否已初始化。如果该属性不是并且仍然具有空值,则默认情况下将跳过它。这通过了验证,因为 minoccurs = 0;
如果该属性是用“”或空格初始化的,则序列化程序将序列化该属性,您将获得一个空标签(如果您定义了保留空格,则为空格)。这仍然是有效的 xml,但您的 xsd 中的限制不允许空元素。如果元素存在,则它必须遵守限制。通过在 xsd 中添加 nillable=true,您可以再次使其有效。序列化程序看到属性已初始化,但属性的内容为空,如果属性是用“[XmlElement(IsNullable=true)]”定义的,它会将 nillable=true 添加到 xml 消息中。
推荐阅读
- kubernetes - Kubernetes 入口 Json 补丁失败
- c# - Azure Active Directory 创建多个租户
- css - Bootstrap SASS 覆盖主按钮文本颜色
- r - 如果列名称包含季度,则重塑数据
- javascript - 有没有办法从 React 组件中导出变量?
- kubernetes - kubectl 等待一个 pod 完成
- java - 两个不同结果的二进制最大堆问题
- automated-tests - 我该如何设置
. .Settings.Run.OnError 以非编程方式用于 BPT 组件的交互式(即基于 IDE 的调试)运行? - sql-server - 强制不使用 group by 中的字段
- java - Java serialVersionUID 是否必须是静态的?可以是子类通过构造函数设置的实例变量吗?