在C#(.NET 3.5)中反序列化xml时,是否可以设置默认值
本文关键字:是否 默认值 设置 xml 反序列化 NET | 更新日期: 2023-09-27 17:48:48
我遇到了一个小问题,有点令人沮丧。在C#(.NET 3.5)中反序列化xml时,是否可以设置默认值?基本上,我试图反序列化一些不在我控制范围内的xml,其中一个元素看起来像这样:
<assignee-id type="integer">38628</assignee-id>
它也可以看起来像这样:
<assignee-id type="integer" nil="true"></assignee-id>
现在,在我的类中,我有以下应该接收数据的属性:
[XmlElementAttribute("assignee-id")]
public int AssigneeId { get; set; }
这对于第一个xml元素示例来说很好,但第二个示例失败了。我已尝试将属性类型更改为int?但这无济于事。在某个时候,我也需要将它序列化回相同的xml格式,但我正在尝试使用内置的序列化支持,而不必使用自己的序列化。
有人经历过这种问题吗?
看起来源XML使用xsi:type和xsi:nil,但没有在它们前面加上命名空间。
您所能做的就是用XSLT处理这些内容,以实现以下目标:
<assignees>
<assignee>
<assignee-id type="integer">123456</assignee-id>
</assignee>
<assignee>
<assignee-id type="integer" nil="true"></assignee-id>
</assignee>
</assignees>
进入这个:
<assignees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<assignee>
<assignee-id xsi:type="integer">123456</assignee-id>
</assignee>
<assignee>
<assignee-id xsi:type="integer" xsi:nil="true" />
</assignee>
</assignees>
然后XmlSerializer将正确处理此问题,而不需要任何自定义代码。这方面的XSLT相当琐碎,而且是一个有趣的练习。从众多"复制"XSLT示例中的一个开始,只需为"type"answers"nil"属性添加一个模板即可输出一个带名称空间的属性。
如果您愿意,可以将XML文档加载到内存中并更改属性,但这不是一个好主意,因为XSLT引擎经过了性能调整,可以处理相当大的文件,而无需将它们完全加载到内存。
您可能需要查看OnDeserializedAttribute、OnSerializationAttribute、On序列化属性和OnDeserilizingAttribute,以便将自定义逻辑添加到序列化过程
XmlSerializer使用xsi:nil,因此我预计您需要为此执行自定义IXmlSerializable序列化。很抱歉