2017-07-11 64 views
0

我使用的工具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

+0

其他类声明为“partial”吗? –

+0

Romano,不确定你指的是哪一个“其他”类。生成的.cs包含多个部分类。尽管唯一其他的真正的类是我的程序类(这不是部分的,但会有帮助吗?),但我还有其他所有的东西都可以免费统治。对不起,部分类对我来说有些未知。 –

+1

你能提供一个证明这一点的[mcve]吗?因为(通常)将属性设置为null会阻止它被序列化 - 参见[this fiddle](https://dotnetfiddle.net/jKW2L6)。也就是说,你所要求的可以用['XmlAttributeOverrides'](https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeoverrides(v = vs.110))完成。 ASPX)。 –

回答

0

Xsd2Code有一个选项来初始化所有领域,所以我怀疑这里所发生的是一个“默认” Manifest创建,这就是你眼看时序列化对象图。

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

因此,我不建议添加或覆盖属性(您可以使用XmlAttributeOverrides来实现),而是建议您将要忽略的元素设置为null

+0

我编辑了我原来的帖子,以包含我使用的Xsd2Code选项。你能否指出你指的是哪个选项,将“初始化所有领域” - 他们都没有看到具体的描述。 –

+0

@WayneIvory我的猜测是'EnableInitializeFields = True'(截图中的第二个属性)。我认为这会导致'Manifest = new Manifest();'在构造函数中生成。这通常很有用,因为您可以设置属性而不用担心空引用。 –

相关问题