2013-02-20 22 views
1

對DataContractSerializer徹底沮喪,我試圖在XmlSerializer中使用IXmlSerializable類型在WCF中啓動並運行。在WCF中使用XmlSerializer序列化IXmlSerializable類型

我已經實現了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

你能發佈最簡單的例子的代碼? – MiMo 2013-02-20 22:08:55

+0

已添加到原始帖子。 – 2013-02-21 10:21:55

回答

0

我看到兩個問題:您的測試模式未定義名爲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); 
    . . . 
} 
+0

謝謝你的洞察!我不能在這個帳戶上登記,但我會100x!我沉浸了這一整天......另一個學習困難的好例子。這引發了許多其他問題(其他問題的討論主題),但最顯着的是相關的:使用原始聲明(根元素,而不是complexType)的XSD被認爲是無效的?我問,因爲A)XmlSpy報告了一個有效的模式和B)我複製了我正在使用的複製錯誤的發佈架構的格式 - 它使相同的'錯誤'。 – 2013-02-21 20:03:05

+0

@TomTom:不客氣。您的原始模式是有效的 - 問題在於'XmlSchemaProvider'機制需要一個複雜類型的名稱或者直接使用'XmlSchemaComplexType'對象,而您提供的是一個元素定義的名稱。 – MiMo 2013-02-21 20:42:41

相關問題