XmlSerializer InvalidOperationExc - 已知问题转换类型
问题描述:
我对XSD.EXE生成的类使用XmlSerializer。XmlSerializer InvalidOperationExc - 已知问题转换类型
XmlSerializer serializer = new XmlSerializer(obj.GetType());
抛出向上
出现InvalidOperationException无法 生成临时类(结果= 1)。 错误CS0030:无法将类型 'itemOrderItemsItem []' 到 'itemOrderItemsItem' 错误CS0029: 无法隐式转换型 'itemOrderItemsItem' 至 'itemOrderItemsItem []'
的fix(下面标记为<!--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...-->
答
如果你有如下形式的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)-->
现在,它的工作。猜测串行器只是二维数组上的barfs。幸运的是我不需要他们。
答
这个固定对我来说,在XSD文件,其中的子元素有maxOccurs的=“*”我增加了额外的行</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-->