【问题标题】:Specified Pattern is called but has no effect - not working (XmlSerializer)调用了指定的模式但没有效果 - 不工作 (XmlSerializer)
【发布时间】:2017-11-27 03:59:40
【问题描述】:

我知道这个话题是重复的。这不是我第一次在XmlSerializer 上工作,而且我没有遇到这个问题。但是这一次,我不知道发生了什么。

public string comp_addr01
{
    get
    {
        return this.comp_addr01Field;
    }
    set
    {
        this.comp_addr01Field = value;
    }
}

[XmlIgnore]
public bool comp_addr01Specified { get { return true; } }

我测试了 comp_add01Specified 正在被调用,但未显示在 xml 输出中。

到目前为止,唯一的方法是添加XmlElement(IsNullable = true)

[XmlElement(IsNullable = true)]
public string comp_addr01
{
    get
    {
        return this.comp_addr01Field;
    }
    set
    {
        this.comp_addr01Field = value;
    }
}

但现在<comp_addr01 xsi:nil="true" /> xsi:nil="true" 已显示,但我不需要显示它。我不知道这是怎么回事

【问题讨论】:

  • 实际上并不清楚您的问题是什么。 comp_add01Specified 不应包含在 xml 中,因为您有 XmlIgnore 。是不是 comp_addr01 没有包含在 xml 中?如果 IsNullable 为空,则不会包含它,这就是事情的工作方式。如果它不为空,它将被包括在内。
  • @TimRutter,感谢您的回复。关键是我希望 comp_addr01 始终出现在 Xml 文件中,无论它的值是否为空;因此,我使用 comp_addr01Sepcified 让 XmlSerializer 知道我需要包含此属性。虽然调用了 comp_addr01Specified,但 comp_addr01 永远不会出现,除非它不为空。在我添加属性XmlElement(IsNullable = true) 后,comp_addr01 开始出现。如果没记错的话,我之前应用了相同的概念并且没有使用 XmlElement 属性。这就是我发布问题的原因。也许我错过了什么。

标签: c# xml xml-serialization xmlserializer


【解决方案1】:

如果 IsNullable 为 false(或省略),则 comp_addr01 的 null 值将导致没有元素被添加到该属性的 xml。在这种情况下,您不能指望序列化程序会写出一个空标签,因为无法知道它以后何时反序列化该空标签是否应该导致 null - 它可能只是您的对象的一个​​实例,没有已定义子属性。

如果 IsNullable 为真,则当属性为 null 时,您将告诉序列化程序使用 xsi:nil="true" 创建一个元素 - xsi:nil 位告诉反序列化程序该元素实际上为 null。

XmlElementAttribute.IsNullable

“获取或设置一个值,该值指示 XmlSerializer 是否必须将设置为 null 的成员序列化为 xsi:nil 属性设置为 true 的空标记。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2017-11-09
    相关资源
    最近更新 更多