是否可以在另一个类中装饰公共属性?

时间:2017-07-11 14:24:32

标签: c# xml serialization xsd decorator

我正在使用一个工具Xsd2Code,它使用xml架构定义文件生成一个包含多个分部类的DespatchAdvice.designer.cs文件。在我的程序中,我可以方便地填充相关数据并将输出序列化为xml。

然而,通常情况下,并非所有情况都如我所愿。我不需要一些最终被序列化的元素,而不是填充数据只会导致它们序列化为空元素。生成的xml必须符合我们客户设定的严格标准,这些空元素“打破”这些标准。

我有几个选择来解决这个问题。我可以从原始的xsd模式文件中删除这些元素,但它们是由GS1标准组织生成的,任何更新都会破坏我自己的自定义,或者至少要求我重新应用它们。

或者我可以修改Xsd2Code生成的.cs文件,删除不需要的属性。但是,与上述类似,.cs的任何再生都会破坏我的修改。

我目前采用的方法是后者的变体,使用XmlIgnoreAttribute()装饰.cs文件中不需要的属性。在下面的代码片段中,Manifest已由该工具生成,但不得在生成的xml中序列化。除了XmlIgnoreAttribute行之外,所有代码都是自动生成的。

    [System.Xml.Serialization.XmlElementAttribute(Order = 3)]
    public DocumentIdentification DocumentIdentification
    {
        get
        {
            return this.documentIdentificationField;
        }
        set
        {
            this.documentIdentificationField = value;
        }
    }

    [System.Xml.Serialization.XmlIgnoreAttribute()]     // Exclude Manifest
    [System.Xml.Serialization.XmlElementAttribute(Order = 4)]
    public Manifest Manifest
    {
        get
        {
            return this.manifestField;
        }
        set
        {
            this.manifestField = value;
        }
    }

    [System.Xml.Serialization.XmlArrayAttribute(Order = 5)]
    [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
    public List<Scope> BusinessScope
    {
        get
        {
            return this.businessScopeField;
        }
        set
        {
            this.businessScopeField = value;
        }
    }

所以问题的关键。有没有办法可以应用XmlIgnoreAttribute而无需修改生成的DespatchAdvice.designer.cs文件(并且无需在重载中重新编码整个Manifest块)?

编辑:

这些是我在生成.cs文件时使用的选项。我从默认值更改的值会突出显示。

Xsd2Code options selected

1 个答案:

答案 0 :(得分:0)

Xsd2Code有一个初始化所有字段的选项,所以我怀疑这里发生的是&#39;默认&#39; Manifest已创建,这是您在序列化对象图时所看到的内容。

XmlSerializer行为是省略null的元素,除非XmlElement属性的IsNullable property设置为true。在这种情况下,它会使用xsi:nil="true"属性序列化一个空元素。

因此,我建议您只想设置要忽略的元素null,而不是尝试添加或覆盖属性(使用XmlAttributeOverrides可以实现)。< / p>