2011-04-08 45 views
1

我对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...--> 

回答

2

如果你有如下形式的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。幸运的是我不需要他们。

0

这个固定对我来说,在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-->