如何解决与 nillable 属性相关的 XML 序列化更改
我想知道是否有人知道 dot net 库中的一些变化,这会导致可空元素的序列化方式不同。三个月前,我们的系统正在生成这种元素,以防相关属性为空:
<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)]”,它将在 xml 消息中添加 nillable=true。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。