【发布时间】:2010-02-03 00:45:13
【问题描述】:
我正在使用 .NET XSD.EXE 导入器从一组 XSD 文件中生成 C# 类。当我尝试将其中一个类序列化为 XML 时,它失败了(InvalidOperationException),当我深入研究它时,我发现其中一个创建的类似乎是错误的。
这里是相关的 XSD 代码:
<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# 代码:
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 异常:
- 无法生成临时类 (result=1)。
- 错误 CS0030:无法将类型“WarningType[]”转换为“WarningType”
- 错误 CS0030:无法将类型“WarningType[]”转换为“WarningType”
- 错误 CS0029:无法将类型“WarningType”隐式转换为“WarningType[]”
- 错误 CS0029:无法将类型“WarningType”隐式转换为“WarningType[]”
但是,如果我将生成的代码从 WarningType[][] 更改为 WarningType[],那么它可以很好地序列化。
每当我重新生成它时都没有编辑生成的 C# 类(希望以后不会那么频繁),还有其他解决方案吗?这是 xsd.exe 中的错误还是 XSD 文件不正确?可能是 XmlSerializer 有问题?
我想要的是正确序列化为针对 XSD 进行验证的 XML 的 C# 代码。现在锯齿状数组似乎是错误的,因为如果我删除它,它就会生成 XML。
我正在使用 Visual Studio 2008。
【问题讨论】:
-
我相信这是一个无法修复的已知错误。请参阅 connect.microsoft.com/VisualStudio/feedback/details/362727/… 了解他们说不会修复的另一个 XSD 错误。
-
@John Saunders - 臭虫,这就是我的想法。有没有你知道的 XSD.exe 的好替代品?
-
.NET 4.5.1 中问题依然存在
标签: c# .net xml xsd invalidoperationexception