我有一个小问题,有点令人沮丧。在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格式,但我正在尝试使用内置的序列化支持而不必诉诸于我自己。
有没有人有这种问题的经验?
答案 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)
您可能需要查看OnDeserializedAttribute,OnSerializingAttribute,OnSerializedAttribute和OnDeserializingAttribute,以便为序列化过程添加自定义逻辑
答案 2 :(得分:1)
XmlSerializer使用xsi:nil - 所以我希望你需要为此做自定义IXmlSerializable序列化。遗憾。