1. <tfoot id='Fpmhm'></tfoot>

    1. <legend id='Fpmhm'><style id='Fpmhm'><dir id='Fpmhm'><q id='Fpmhm'></q></dir></style></legend>
      <i id='Fpmhm'><tr id='Fpmhm'><dt id='Fpmhm'><q id='Fpmhm'><span id='Fpmhm'><b id='Fpmhm'><form id='Fpmhm'><ins id='Fpmhm'></ins><ul id='Fpmhm'></ul><sub id='Fpmhm'></sub></form><legend id='Fpmhm'></legend><bdo id='Fpmhm'><pre id='Fpmhm'><center id='Fpmhm'></center></pre></bdo></b><th id='Fpmhm'></th></span></q></dt></tr></i><div id='Fpmhm'><tfoot id='Fpmhm'></tfoot><dl id='Fpmhm'><fieldset id='Fpmhm'></fieldset></dl></div>

    2. <small id='Fpmhm'></small><noframes id='Fpmhm'>

      • <bdo id='Fpmhm'></bdo><ul id='Fpmhm'></ul>

      .NET xsd 导入器创建不可序列化的类

      时间:2023-06-02

      <i id='kRczM'><tr id='kRczM'><dt id='kRczM'><q id='kRczM'><span id='kRczM'><b id='kRczM'><form id='kRczM'><ins id='kRczM'></ins><ul id='kRczM'></ul><sub id='kRczM'></sub></form><legend id='kRczM'></legend><bdo id='kRczM'><pre id='kRczM'><center id='kRczM'></center></pre></bdo></b><th id='kRczM'></th></span></q></dt></tr></i><div id='kRczM'><tfoot id='kRczM'></tfoot><dl id='kRczM'><fieldset id='kRczM'></fieldset></dl></div>

      <small id='kRczM'></small><noframes id='kRczM'>

          • <bdo id='kRczM'></bdo><ul id='kRczM'></ul>

              1. <tfoot id='kRczM'></tfoot>

                  <tbody id='kRczM'></tbody>
                <legend id='kRczM'><style id='kRczM'><dir id='kRczM'><q id='kRczM'></q></dir></style></legend>
                本文介绍了.NET xsd 导入器创建不可序列化的类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

                限时送ChatGPT账号..

                我正在使用 .NET XSD.EXE 导入器生成来自 XSD 文件集合的 C# 类.当我尝试将其中一个类序列化为 XML 时,它失败了(InvalidOperationException),当我深入研究它时,我发现其中一个创建的类似乎是错误的.

                I am using the .NET XSD.EXE importer to generate C# classes from a collection of XSD files. When I tried to serialize one of the classes to XML it failed (InvalidOperationException), and when I dug into it I discovered it one of the created classes appears to be wrong.

                这里是相关的 XSD 代码:

                Here is the pertinent XSD code:

                <xsd:complexType name="SuccessType">
                    <xsd:annotation>
                        <xsd:documentation>Indicates in a response message that a request was successfully processed.</xsd:documentation>
                    </xsd:annotation>
                    <xsd:sequence>
                        <xsd:element ref="Warnings" minOccurs="0" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
                <!-- .. snip .. -->
                <xsd:element name="Warnings" type="WarningsType">
                    <xsd:annotation>
                        <xsd:documentation>The processing status of a business message and any related warnings or informational messages.</xsd:documentation>
                    </xsd:annotation>
                </xsd:element>
                <!-- .. snip .. -->
                <xsd:complexType name="WarningsType">
                    <xsd:annotation>
                        <xsd:documentation>A collection of warnings generated by the successful processing of a business message.</xsd:documentation>
                    </xsd:annotation>
                    <xsd:sequence>
                        <xsd:element ref="Warning" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
                <!-- .. snip .. -->
                <xsd:element name="Warning" type="WarningType">
                    <xsd:annotation>
                        <xsd:documentation>Defines details of a warning that occurred during message processing.</xsd:documentation>
                    </xsd:annotation>
                </xsd:element>
                <!-- .. snip .. -->
                <xsd:complexType name="WarningType">
                    <xsd:annotation>
                        <xsd:documentation>Defines details of a warning that occurred during message processing.</xsd:documentation>
                    </xsd:annotation>
                    <xsd:sequence>
                        <xsd:element ref="WarningCategory"/>
                        <xsd:element ref="WarningCode"/>
                        <xsd:element ref="WarningShortMessage"/>
                        <xsd:element ref="WarningMessage"/>
                    </xsd:sequence>
                </xsd:complexType>
                

                下面是从中生成的 C# 代码:

                And here is the C# code generated from it:

                public partial class SuccessType
                {
                
                    private WarningType[][] warningsField;
                
                    /// <remarks/>
                    [System.Xml.Serialization.XmlArrayItemAttribute("Warning", typeof(WarningType), IsNullable = false)]
                    public WarningType[][] Warnings
                    {
                        get
                        {
                            return this.warningsField;
                        }
                        set
                        {
                            this.warningsField = value;
                        }
                    }
                }
                

                它使 Warnings 成为 WarningType 数组的数组.当我尝试将其序列化为 XML 时,我得到一个 InvalidOperationException 异常:

                It made Warnings an array of an array of WarningType. When I attempt to serialize that to XML I get an InvalidOperationException exception:

                • 无法生成临时类 (result=1).
                • 错误 CS0030:无法将类型WarningType[]"转换为WarningType"
                • 错误 CS0030:无法将类型WarningType[]"转换为WarningType"
                • 错误 CS0029:无法将类型WarningType"隐式转换为WarningType[]"
                • 错误 CS0029:无法将类型WarningType"隐式转换为WarningType[]"

                但是如果我将生成的代码从 WarningType[][] 更改为 WarningType[] 那么它可以很好地序列化.

                But if I change the generated code from WarningType[][] to WarningType[] then it serializes fine.

                每当我重新生成它时都没有编辑生成的 C# 类(希望以后不会那么频繁),还有其他解决方案吗?这是 xsd.exe 中的错误还是 XSD 文件不正确?可能是 XmlSerializer 有问题?

                Short of editing the generated C# class whenever I regenerate this (which hopefully will be less frequently going forward), is there any other solution? Is this a bug in xsd.exe or is the XSD file incorrect? Maybe there is a problem in the XmlSerializer?

                我想要的是正确序列化为针对 XSD 进行验证的 XML 的 C# 代码.现在锯齿状数组似乎是错误的,因为如果我删除它,它就会生成 XML.

                What I want is C# code that correctly serializes to XML that validates against the XSD. Right now the jagged array seems to be wrong because if I remove it then it generates the XML.

                我正在使用 Visual Studio 2008.

                I am using Visual Studio 2008.

                推荐答案

                xsd.exe工具有bug.我不记得这个特别的,但我记得发现了锯齿状数组的问题,这可能仍然是一个错误.如果您愿意,可以使用 XsdObjbectGen 工具,同样来自 Microsoft,但独立于 .NET SDK 带外发布.

                There are bugs in the xsd.exe tool. I don't remember this particular one, but I do remember finding problems with jagged arrays, and it's possible this remains a bug. if you're willing, you could use the XsdObjbectGen tool, also from Microsoft, but released independently and out-of-band from the .NET SDK.

                您可以做的一件事是反其道而行之:编写 C# 代码,然后使用 xsd.exe 生成架构,看看有什么不同.xsd.exe 可能希望架构具有特定的外观,以便为锯齿状数组正确生成正确的代码.

                One thing you could do is go the reverse direction: write the C# code, then generate the schema with xsd.exe, and see what is different. It's possible xsd.exe wants the schema to look a particular way, in order to correctly generate correct code for jagged arrays.

                实际上,在重新阅读您的问题后,您从未说出您真正想要的内容.您是否希望 SuccessType 包含数组数组?

                Actually, upon re-reading your question, you never said what you really wanted. Do you want SuccessType to contain an array-of-arrays, or not?

                它是 WarningsType 还是 WarningType?您提供的代码片段之间存在一些分歧.

                And is it WarningsType or WarningType? There's some disagreement between the code snips you provided.

                假设您想要数组数组,我编写了以下 C# 代码:

                Assuming you wanted the array-of-arrays, I wrote this C# code:

                public class WarningType
                {
                    public String oof;
                }
                
                
                public partial class SuccessType
                {
                    private WarningType[][] warningsField;
                
                    /// <remarks/>
                    [System.Xml.Serialization.XmlArrayItemAttribute("Warning", typeof(WarningType[]), IsNullable = false)]
                    public WarningType[][] Warnings
                    {
                        get
                        {
                            return this.warningsField;
                        }
                        set
                        {
                            this.warningsField = value;
                        }
                    }
                }
                

                ... 然后将其编译为 DLL.然后我在那个 DLL 上运行 xsd.exe,并生成了这个 XSD:

                ... then compiled it into a DLL. Then I ran xsd.exe on that DLL, and generated this XSD:

                <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
                  <xs:element name="WarningType" nillable="true" type="WarningType" />
                  <xs:complexType name="WarningType">
                    <xs:sequence>
                      <xs:element minOccurs="0" maxOccurs="1" name="oof" type="xs:string" />
                    </xs:sequence>
                  </xs:complexType>
                  <xs:element name="SuccessType" nillable="true" type="SuccessType" />
                  <xs:complexType name="SuccessType">
                    <xs:sequence>
                      <xs:element minOccurs="0" maxOccurs="1" name="Warnings" type="ArrayOfArrayOfWarningType" />
                    </xs:sequence>
                  </xs:complexType>
                  <xs:complexType name="ArrayOfArrayOfWarningType">
                    <xs:sequence>
                      <xs:element minOccurs="0" maxOccurs="unbounded" name="Warning" type="ArrayOfWarningType" />
                    </xs:sequence>
                  </xs:complexType>
                  <xs:complexType name="ArrayOfWarningType">
                    <xs:sequence>
                      <xs:element minOccurs="0" maxOccurs="unbounded" name="WarningType" nillable="true" type="WarningType" />
                    </xs:sequence>
                  </xs:complexType>
                </xs:schema>
                

                ...它往返.如果我然后在该架构上运行 xsd.exe,我会得到一个包含数组数组的类型.

                ...and it round-trips. If I then run xsd.exe on that schema, I get a type that wraps an array-of-arrays.

                这篇关于.NET xsd 导入器创建不可序列化的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:我可以在 XSD C# 生成的类创建的 XML 中的同一标记 下一篇:c# XML Schema 验证

                相关文章

                最新文章

                    <legend id='44oAP'><style id='44oAP'><dir id='44oAP'><q id='44oAP'></q></dir></style></legend>
                  1. <small id='44oAP'></small><noframes id='44oAP'>

                      <bdo id='44oAP'></bdo><ul id='44oAP'></ul>

                    <tfoot id='44oAP'></tfoot>

                    <i id='44oAP'><tr id='44oAP'><dt id='44oAP'><q id='44oAP'><span id='44oAP'><b id='44oAP'><form id='44oAP'><ins id='44oAP'></ins><ul id='44oAP'></ul><sub id='44oAP'></sub></form><legend id='44oAP'></legend><bdo id='44oAP'><pre id='44oAP'><center id='44oAP'></center></pre></bdo></b><th id='44oAP'></th></span></q></dt></tr></i><div id='44oAP'><tfoot id='44oAP'></tfoot><dl id='44oAP'><fieldset id='44oAP'></fieldset></dl></div>