在C#(.NET 3.5)中反序列化xml时是否可以设置默认值?

时间:2008-10-10 22:04:31

标签: c# xml serialization

我有一个小问题,有点令人沮丧。在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格式,但我正在尝试使用内置的序列化支持而不必诉诸于我自己。

有没有人有这种问题的经验?

3 个答案:

答案 0 :(得分:3)

看起来你的源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”和“nil”属性的模板即可输出命名空间属性。

如果您愿意,可以将XML文档加载到内存中并更改属性,但这不是一个好主意,因为XSLT引擎已针对性能进行了调整,并且可以处理非常大的文件而无需将它们完全加载到内存中。

答案 1 :(得分:2)

您可能需要查看OnDeserializedAttributeOnSerializingAttributeOnSerializedAttributeOnDeserializingAttribute,以便为序列化过程添加自定义逻辑

答案 2 :(得分:1)

XmlSerializer使用xsi:nil - 所以我希望你需要为此做自定义IXmlSerializable序列化。遗憾。