在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格式,但我正在尝试使用内置的序列化支持,而不必使用自己的序列化。

有人经历过这种问题吗?

在C#(.NET 3.5)中反序列化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序列化。很抱歉