无法生成临时类(result = 1)。错误CS0030:无法将类型'Type []'转换为'Type'?

时间:2011-07-13 12:33:05

标签: c# xsd xml-deserialization

使用xsd.exe工具从xsd文件创建类后,出现此错误。所以我在网上搜索并找到了解决方案。这是链接:http://satov.blogspot.com/2006/12/xsdexe-generated-classes-causing.html

问题是这会使代码运行,但不知何故反序列化数据似乎已损坏。我做了网站建议的内容,最后第二个数组维度总是空的(参见网站的评论,有人也有这个问题)。问题是,我现在该如何解决这个问题?是否有另一种工具来创建xsd文件?我尝试了Xsd2Code,没有成功。

谢谢: - )

8 个答案:

答案 0 :(得分:110)

您需要更改序列化类中成员变量的类型。例如,如果它引发错误,如:

  

无法生成临时类(result = 1)。   错误CS0030:无法将类型'Data []'转换为'Data'。

我在生成的文件中搜索了数据类型名称,我发现了这个:

[System.Xml.Serialization.XmlArrayItemAttribute("Data", typeof(Data), IsNullable=false)]
public Data[][] Row

Data[][]替换为Data[] - 将数据类型从2D数组更改为1D数组。它会解决你的问题。 :)

答案 1 :(得分:13)

有同样的问题,但Xsd2Code没有与VS2012集成。所以我去了我的xsd.exe生成的.cs文件并做了:

查找[] [] 替换[]

有效。

答案 2 :(得分:7)

我收到了这个错误。在您的解决方案中,该文件中有reference.cs文件,您需要搜索“[] []”,然后会有两个结果..

您需要从两个地方删除“[] []”中的一个“[]”..

对我有用..

谢谢..

答案 3 :(得分:2)

添加 <xs:attribute name="tmp" type="xs:string" /> 每一次之后 <xs:sequence maxOccurs="unbounded"> <xs:element ../> </xs:sequence>

<xs:sequence> <xs:element maxOccurs="unbounded"/> </xs:sequence>
模式文件中的元素如果您不想丢失数组的维度

答案 4 :(得分:1)

如果它在VB.net中,那么你必须在Reference.vb中搜索()()并替换为()

答案 5 :(得分:1)

对我而言,修补用于生成代码的XML是有帮助的。它发生在:

<Names>
    <Name></Name>
    <Name></Name>
</Names>

然后通过xsd优化到双数组名称输入

我做的是:

<Names>
    <Dummy></Dummy>
    <Name></Name>
    <Name></Name>
</Names>

xsd不优化它,但保留单个数组名称

答案 6 :(得分:0)

对于我的情况,由于XmlArrayItem属性属性声明无效而导致的问题。

来自

[XmlArrayItem("MyArray", typeof(string))]
public List<ClassName> Items{ get; set; }

我改变了适当的类型:从string到ClassName

[XmlArrayItem("MyArray", typeof(ClassName))]
public List<ClassName> Items{ get; set; }

希望这有帮助!

答案 7 :(得分:0)

这真的是@WaldemarGałęzinowski 的回答https://stackoverflow.com/a/35896991/157224 扩大了一点。

xsd.exe 有一个优化,当您在序列中有一个没有属性的无界元素时,该优化就会启动。

Parent-Child

优化将避免为父级创建特殊类型,而是将其设为子级数组。

ChildType[] Parent { get; set; } 而不是 ParentType Parent { get; set; } 并且您可以像 Parent[0] 而不是 Parent.Child[0] 那样访问孩子。 (我觉得这个优化有时有点混乱)

这里发生的事情是你多了一层无界、无属性的元素

Parent-child-grandchild

优化应用了两次,结果是 GrandChildType[][] Parent {get; set;},并且您访问了 favorite 的第一个孙子,例如 Parent[0][0] 而不是 Parent.Child[0].GrandChild[0]

问题是 .Net 序列化程序不支持数组数组并生成无效代码。

我不知道为什么微软这么多年都没有修复这个错误,但解决方法很简单。

只需通过向序列添加可选属性或可选元素来强制 xsd.exe 为父级或子级生成一个类。例如 workaround

导致Parent[0].GrandChild[0]