2009-09-21 63 views
7

.NETC#:WCF服務與IXmlSerializable的成員變成數據集

我有一個Web服務,實現IXmlSerializable的消息的數據成員之一,當我做「添加服務引用」該成員將成爲一個DataSet。

我正在嘗試將序列號Expression<TDelegate>作爲參數傳遞給Web服務。

問:我如何做一個DataSet出在客戶端的IXmlSerializable實例?

回答

4

通常,通過SOAP或WCF定製序列化(通過IXmlSerializable)是一個壞主意。如果你正在使用與WCF進行程序集共享(即代替生成代理,將DTO程序集發佈到客戶端),那麼它可以工作,但它仍然違反SOA/mex等。實際上,我很驚訝它不只是給你XmlElement或類似的,但是嘿!

我將你現有的(IXmlSerializable)對象模型簡單地映射到簡單的類型,可以使用標準序列(即無IXmlSerializable)。

BTW;你看過ADO.NET數據服務嗎?這已經在線路上處理Expression(儘管不是一個值)。作爲值傳遞,MetaLinq

10

我意識到這是一個老問題,但這裏未來的讀者是我發現:實現IXmlSerializable需要有爲了定義的架構爲他們與WSDL工作

對象,否則淨由於序列化是自定義的,因此框架不知道如何定義合同。

要指定模式,您不應在IXmlSerializable接口中使用GetSchema方法,而應使用XmlSchemaProvider屬性(msdn link)。您可以在模式提供程序部分閱讀有關Microsoft的文章Enrich Your XML Serialization With Schema Providers In The .NET Framework的更多信息。

您可以在XmlSchemaProvider屬性頁和文章中找到示例,我建議將您的模式存儲在.xsd文件中,並像示例中一樣讀取它們。通過代碼編寫架構充其量是麻煩的。

一旦我實現模式提供程序,序列化按預期工作。如果您的WCF服務是IIS託管的,請參閱有關如何通過反射Can I use reflection to find the bin/[Configuration] folder in ASP.NET instead of the asp temporary folder獲取正確的IIS目錄的問題。從微軟的文章

例子:

[XmlRoot(ElementName="product_root", DataType="product_type", 
    Namespace="http://SchemaProvider.Example.org/Product.xsd", 
    IsNullable = false)] 
[XmlSchemaProviderAttribute("GetSchemaFile")] 
public class Product : IXmlSerializable 
{ 
    public static XmlSchemaComplexType GetSchemaFile(
     System.Xml.Schema.XmlSchemaSet xs) 
    { 
     string xsdFile = Directory.GetCurrentDirectory() + 
      "\\Product.xsd"; 
     XmlSerializer schemaSerializer = 
      new XmlSerializer(typeof(XmlSchema)); 
     XmlSchema schema = 
      (XmlSchema)schemaSerializer.Deserialize(
       XmlReader.Create(xsdFile)); 
     xs.Add(schema); 

     // target namespace 
     string tns = "http://SchemaProvider.Example.org/Product.xsd"; 
     XmlQualifiedName name = 
      new XmlQualifiedName("product_type", tns); 
     XmlSchemaComplexType productType = 
      (XmlSchemaComplexType) schema.SchemaTypes[name]; 

     return productType; 
    } 

    ... 
}