【问题标题】:Is it possible to set a default value when deserializing xml in C# (.NET 3.5)?在 C# (.NET 3.5) 中反序列化 xml 时是否可以设置默认值?
【发布时间】:2008-10-10 22:04:31
【问题描述】:

我遇到了一个有点令人沮丧的小问题。在 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# xml serialization


    【解决方案1】:

    看起来您的源 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 引擎已针对性能进行了调整,并且可以处理相当大的文件而无需将它们完全加载到内存中。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 那些方法只能用二进制序列化(即 BinaryFormatter)调用,不能用 XML 序列化。
      【解决方案3】:

      XmlSerializer 使用 xsi:nil - 所以我希望您需要为此进行自定义 IXmlSerializable 序列化。对不起。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多