在WCF中使用XmlSerializer序列化IXmlSerializable类型
我对DataContractSerializer非常失望,我正尝试使用XmlSerializer中的IXmlSerializable类型在WCF中启动并运行 我已经在类中实现了IXmlSerializable和XmlSchemaProvider,以便为OperationContract序列化并声明[XmlSerializerFormat] 使用复杂模式,我在尝试查看WSDL时遇到以下错误:在WCF中使用XmlSerializer序列化IXmlSerializable类型,wcf,xml-serialization,xsd,xmlserializer,ixmlserializable,Wcf,Xml Serialization,Xsd,Xmlserializer,Ixmlserializable,我对DataContractSerializer非常失望,我正尝试使用XmlSerializer中的IXmlSerializable类型在WCF中启动并运行 我已经在类中实现了IXmlSerializable和XmlSchemaProvider,以便为OperationContract序列化并声明[XmlSerializerFormat] 使用复杂模式,我在尝试查看WSDL时遇到以下错误: "Schema type information provided by IXmlSerializable
"Schema type information provided by IXmlSerializable is invalid:
Reference to undeclared attribute group 'anAttributeGroupInMySchema'"
该模式具有各种包含(该属性在其中一个包含中声明)。我甚至在代码中添加了包含的模式(schema.Includes
),但没有效果
即使是在最简单的示例项目(包含1个元素和2个属性的简单模式,简单的对应类,你可以说)中,我最终还是克服了这个错误,但遇到了:
"WCF_IXmlSerializable.TestClass.TestSchemaProvider() must return a valid type
name. Type 'TEST' cannot be found in the targetNamespace='www.test.com'."
遗憾的是,我不知道什么是有效的类型名。它肯定不是我的XSD AFAICS中的元素名
有什么想法吗
编辑:
示例源代码可以在线查看。我发现两个问题:您的测试模式没有定义名为
test\u CLASS
的类型,它定义了一个具有该名称的元素。XSD应该是这样的:
<xs:schema xmlns="www.test.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="www.test.com">
<xs:complexType name="TEST_CLASS">
<xs:sequence>
<xs:element name="TEST">
<xs:complexType>
<xs:attribute name="TYPE"/>
<xs:attribute name="DURATION"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
我发现了两个问题:您的测试模式没有定义名为
test\u CLASS
的类型,它定义了一个具有该名称的元素。XSD应该是这样的:
<xs:schema xmlns="www.test.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="www.test.com">
<xs:complexType name="TEST_CLASS">
<xs:sequence>
<xs:element name="TEST">
<xs:complexType>
<xs:attribute name="TYPE"/>
<xs:attribute name="DURATION"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
你能发布最简单示例的代码吗?添加到原始帖子中。你能发布最简单示例的代码吗?添加到原始帖子中。感谢你的见解!我不能为这个帐户投票,但我会投100倍!我花了整整一天的时间。。。另一个艰苦学习的好例子。这引发了许多其他问题(其他地方的对话主题),但最突出的问题似乎是相关的:使用原始声明(根元素,而不是complexType)的XSD是否被视为无效?我问这个问题是因为A)XmlSpy报告了一个有效的模式,B)我从正在使用的已发布模式中复制了格式以复制错误-它也会犯同样的“错误”。@TomTom:不客气。您的原始架构是有效的-问题是
XmlSchemaProvider
机器需要复杂类型的名称,或者直接需要XmlSchemaComplexType
对象,而您提供的是元素定义的名称。感谢您的理解!我不能为这个帐户投票,但我会投100倍!我花了整整一天的时间。。。另一个艰苦学习的好例子。这引发了许多其他问题(其他地方的对话主题),但最突出的问题似乎是相关的:使用原始声明(根元素,而不是complexType)的XSD是否被视为无效?我问这个问题是因为A)XmlSpy报告了一个有效的模式,B)我从正在使用的已发布模式中复制了格式以复制错误-它也会犯同样的“错误”。@TomTom:不客气。您的原始模式是有效的-问题是XmlSchemaProvider
机器需要复杂类型的名称或直接是XmlSchemaComplexType
对象,而您提供的是元素定义的名称。