繁体   English   中英

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

[英]Is it possible to set a default value when deserializing xml in C# (.NET 3.5)?

我有一个小问题,有点令人沮丧。 在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”和“nil”属性的模板即可输出命名空间属性。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM