5

我正在对 XSD.EXE 生成的类使用 XmlSerializer。

XmlSerializer serializer = new XmlSerializer(obj.GetType());

呕吐

InvalidOperationException无法生成临时类(结果=1)。错误 CS0030:无法将类型“itemOrderItemsItem[]”转换为“itemOrderItemsItem”错误 CS0029:无法将类型“itemOrderItemsItem”隐式转换为“itemOrderItemsItem[]”

修复(在下面标记<!--fix...-->)说要在我的架构中添加一些愚蠢的元素,但这不起作用。此修复程序已有五年历史。有没有解决办法?

              <xs:sequence>
              <xs:element name="item" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="model" type="xs:string" minOccurs="0" />
                    <xs:element name="description" type="xs:string" minOccurs="0" />
                    <xs:element name="material" type="xs:string" minOccurs="0" />
                    <xs:element name="lot" type="xs:string" minOccurs="0" />
                    <xs:element name="serial" type="xs:string" minOccurs="0" />
                    <xs:element name="transferQty" type="xs:string" minOccurs="0" />
                    <xs:element name="shipQty" type="xs:string" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>     
            </xs:sequence>
       <xs:attribute name="tmp" type="xs:string" /><!--fix...-->
4

2 回答 2

3

如果您有表单的 XML

 <items>
    <item>
      <model>10</model>
      <description>Torque wrench</description>
      <material>100</material>
      <lot>3</lot>
      <serial></serial>
      <transferQty>1</transferQty>
      <shipQty></shipQty>
    </item>
    <item>
           //...
    </item>
    <item>
           //...
    </item>
  </items>

Xsd.exe 将生成一个 xsd:

<xs:element name="items" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="item" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="model" type="xs:string" minOccurs="0" />
                        <xs:element name="description" type="xs:string" minOccurs="0" />
                        <xs:element name="material" type="xs:string" minOccurs="0" />
                        <xs:element name="lot" type="xs:string" minOccurs="0" />
                        <xs:element name="serial" type="xs:string" minOccurs="0" />
                        <xs:element name="transferQty" type="xs:string" minOccurs="0" />
                        <xs:element name="shipQty" type="xs:string" minOccurs="0" />
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>

然后

xsd.exe "this.xsd" /c

生成具有二维数组 (items[][]) 的类。我只想要一个一维数组。我改变了第一行:

<xs:element name="items" minOccurs="0"><!--got rid of maxOccurs (which is what causes the issue)-->

现在它起作用了。猜猜序列化器只是对二维数组表示不满。幸运的是我不需要它们。

于 2011-04-08T13:59:53.127 回答
3

为我修复了它,在子元素具有 maxOccurs="unbounded" 的 xsd 文件中,我在之后添加了额外的行</xs:sequence>

<xs:attribute name="tmp" type="xs:string" />

这是 XmlSerializer 代码生成组件中的一个已知问题:它无法处理某些嵌套无界元素的情况。它创建的对象模型无效:用户不能使用它来生成 xml 消息。

不幸的是,要解决这个问题,您必须编辑您的模式以确保所有类似数组的构造都将得到正确处理。您需要稍微修改具有以下内容的所有架构构造:

<xs:sequence maxOccurs="unbounded">
  <xs:element ../>
<xs:sequence>

或者

<xs:sequence>
  <xs:element maxOccurs="unbounded"/>
<xs:sequence>

必须改为(分别)

<xs:sequence maxOccurs="unbounded">
  <xs:element ../>
<xs:sequence>
<xs:attribute name="tmp" type="xs:string" /> <!--FIX LINE TO BE ADDED-->

或者

<xs:sequence>
  <xs:element maxOccurs="unbounded"/>
<xs:sequence>
<xs:attribute name="tmp" type="xs:string" /> <!--FIX LINE TO BE ADDED-->
于 2015-09-11T09:13:05.690 回答