在WCF中使用XmlSerializer序列化IXmlSerializable类型

时间:2013-02-20 20:57:33

标签: wcf xml-serialization xsd xmlserializer ixmlserializable

对DataContractSerializer非常沮丧,我正在尝试使用带有XmlSerializer的IXmlSerializable类型在WCF中运行。

我在我的类中实现了IXmlSerializable XmlSchemaProvider,以便为我的OperationContract序列化并声明[XmlSerializerFormat]。

使用复杂的模式,我在尝试查看WSDL时遇到以下错误:

"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的元素名称。

有什么想法吗?

修改

可以在线查看示例源代码here

1 个答案:

答案 0 :(得分:1)

我看到两个问题:您的测试架构没有定义名为TEST_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>

第二个问题是应使用XmlSchema方法加载XmlSchema.Read()个对象:

using (XmlReader reader = XmlReader.Create(xsdDir + xsdFile)) {
  XmlSchema schema = XmlSchema.Read(reader, null); 
  . . . 
}