Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在另一个类别中装饰公共财产?_C#_Xml_Serialization_Xsd_Decorator - Fatal编程技术网

C# 是否可以在另一个类别中装饰公共财产?

C# 是否可以在另一个类别中装饰公共财产?,c#,xml,serialization,xsd,decorator,C#,Xml,Serialization,Xsd,Decorator,我正在使用一个工具Xsd2Code,它使用xml模式定义文件生成包含多个分部类的DispatchAdvice.designer.cs文件。在我的程序中,我可以方便地填充相关数据并将输出序列化为xml 然而,就像通常的情况一样,并不是所有的事情都像我希望的那样。我不需要一些最终序列化的元素,不填充数据只会导致它们序列化为空元素。生成的xml必须满足客户设置的严格标准,这些空元素“破坏”了这些标准 我有几个选择来回避这个问题。我可以从原始xsd模式文件中删除这些元素,但它们是由GS1标准组织生成的,

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

然而,就像通常的情况一样,并不是所有的事情都像我希望的那样。我不需要一些最终序列化的元素,不填充数据只会导致它们序列化为空元素。生成的xml必须满足客户设置的严格标准,这些空元素“破坏”了这些标准

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

或者,我可以修改Xsd2Code生成的.cs文件,删除那些不需要的属性。但与上面类似,任何对.cs的更新都会破坏我的修改

我目前采用的方法是后者的一种变体,用XmlIgnoreAttribute()装饰.cs文件中不需要的属性。在下面的代码中,工具已生成了片段清单,但不能在生成的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;
        }
    }
[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()正在构造函数中生成。这通常很有用,因为您可以只设置属性而不必担心空引用。