C# 是否可以在另一个类别中装饰公共财产?
我正在使用一个工具Xsd2Code,它使用xml模式定义文件生成包含多个分部类的DispatchAdvice.designer.cs文件。在我的程序中,我可以方便地填充相关数据并将输出序列化为xml 然而,就像通常的情况一样,并不是所有的事情都像我希望的那样。我不需要一些最终序列化的元素,不填充数据只会导致它们序列化为空元素。生成的xml必须满足客户设置的严格标准,这些空元素“破坏”了这些标准 我有几个选择来回避这个问题。我可以从原始xsd模式文件中删除这些元素,但它们是由GS1标准组织生成的,任何更新都会破坏我自己的定制,或者至少需要我重新应用它们 或者,我可以修改Xsd2Code生成的.cs文件,删除那些不需要的属性。但与上面类似,任何对.cs的更新都会破坏我的修改 我目前采用的方法是后者的一种变体,用XmlIgnoreAttribute()装饰.cs文件中不需要的属性。在下面的代码中,工具已生成了片段清单,但不能在生成的xml中序列化。除XmlIgnoreAttribute行外,所有代码都是自动生成的C# 是否可以在另一个类别中装饰公共财产?,c#,xml,serialization,xsd,decorator,C#,Xml,Serialization,Xsd,Decorator,我正在使用一个工具Xsd2Code,它使用xml模式定义文件生成包含多个分部类的DispatchAdvice.designer.cs文件。在我的程序中,我可以方便地填充相关数据并将输出序列化为xml 然而,就像通常的情况一样,并不是所有的事情都像我希望的那样。我不需要一些最终序列化的元素,不填充数据只会导致它们序列化为空元素。生成的xml必须满足客户设置的严格标准,这些空元素“破坏”了这些标准 我有几个选择来回避这个问题。我可以从原始xsd模式文件中删除这些元素,但它们是由GS1标准组织生成的,
[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;
}
}
[System.Xml.Serialization.xmlementAttribute(Order=3)]
公共文件识别文件识别
{
得到
{
返回此.documentIdentificationField;
}
设置
{
this.documentIdentificationField=值;
}
}
[System.Xml.Serialization.XmlIgnoreAttribute()]//排除清单
[System.Xml.Serialization.XmlElementAttribute(顺序=4)]
公共舱单
{
得到
{
返回此.manifestField;
}
设置
{
this.manifestField=值;
}
}
[System.Xml.Serialization.XmlArrayAttribute(Order=5)]
[System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)]
公共列表业务范围
{
得到
{
返回此.businessScope字段;
}
设置
{
this.businessScopeField=值;
}
}
因此,我的问题的关键。是否有一种方法可以在不修改生成的DispatchAdvice.designer.cs文件的情况下应用XmlIgnoreAttribute(并且不必在重载中重新编码整个清单块)
编辑:
这些是我在生成.cs文件时使用的选项。我从默认值更改的值将高亮显示
Xsd2Code有一个初始化所有字段的选项,因此我怀疑这里发生的是创建了一个“默认”清单,这就是序列化对象图时看到的
XmlSerializer
行为是省略null
的元素,除非xmlement
属性设置为true
。在这种情况下,它将使用xsi:nil=“true”
属性序列化空元素
因此,与其尝试添加或覆盖属性(您可以使用来实现),我建议您只需将要忽略的元素设置为
null
是否另一个类声明为partial
?Romano,不确定您指的是哪个“other”类。生成的.cs包含多个分部类。其他所有我可以自由支配的东西,尽管唯一真正的类是我的程序类(这不是局部的,但会有帮助吗?)对不起,局部类对我来说有点未知。你能提供一个例子来说明这一点吗?因为(通常)将属性设置为null会阻止它被序列化-请参阅。这就是说,你的问题可能可以解决。@RomanoZumbé,对不起-我没有在上面的评论中标记你。@CharlesMager,我不在办公室(在澳大利亚),所以我需要24小时来扭转mcve,但是上面的代码没有经过我的修改就产生了这个输出:我编辑了我的原始文章,以包含我使用的Xsd2Code选项。您能否指出您所指的哪个选项将“初始化所有字段”-它们似乎都没有准确的描述。@WayneIvory我猜是EnableInitializeFields=True
(屏幕截图上的第二个属性)。我认为这会导致例如Manifest=newmanifest()代码>正在构造函数中生成。这通常很有用,因为您可以只设置属性而不必担心空引用。