2009-09-21 5 views
7

.NETC#の:IXMLSerializable部材とのWCFサービスは、私は、Webサービスを持っているDataSetに

を回す私はメンバーがDataSetになったことを「サービス参照の追加」ないとき、メッセージのデータメンバーの一人は、IXmlSerializableを実装しています。

私は、WebサービスへのパラメータとしてシリアライズさExpression<TDelegate>に合格しようとしています。

Q:は、どのように私は、クライアント側のIXmlSerializableインスタンスのうちDataSetを作るのですか?一般的に

答えて

4

は、SOAPやWCFのいずれかを超える(IXmlSerializable経由)カスタムシリアライズは悪い考えです。 WCFでアセンブリ共有を使用している場合(つまり、プロキシ生成ではなく、クライアントにDTOアセンブリを出荷する)、それでも動作しますが、SOA/mexなどには依然として違反しています。実際、あなたにXmlElementまたはそれに類するものを与えなさい、しかしheh!

私は単に標準のシリアル化(すなわち、無IXmlSerializable)を使用することができますシンプルタイプに既存の(IXmlSerializable)オブジェクト・モデルをマップします。

BTW;あなたはADO.NET Data Servicesを見ましたか?これはすでに(値ではありませんが)Expressionを処理しています。値として渡す場合は、MetaLinq

10

私はこれは古い質問ですが、ここでは、将来の読者のために実現するには、私が発見したものです:彼らは、WSDLで動作するために定義されたスキーマを持っているIXmlSerializable必要性を実装

オブジェクト、そうでない場合はネットフレームワークは、シリアル化がカスタムであるため契約を定義する方法を知らない。

スキーマを指定するには、IXmlSerializableインターフェイスでGetSchemaメソッドを使用するはずではなく、XmlSchemaProvider属性(msdn link)を使用します。マイクロソフトの記事Enrich Your XML Serialization With Schema Providers In The .NET Frameworkのスキーマプロバイダーのセクションで詳しく読むことができます。

あなたはXmlSchemaProvider属性ページと記事の両方の例を見つけることができ、私はの.xsdファイルであなたのスキーマを格納し、例のようにそれらを読むことをお勧めします。コードを使ってスキーマを書くのは、せいぜい面倒です。私は、スキーマプロバイダーを実装したら期待通り

は、シリアル化が働いていました。 WCFサービスがIISでホストされている場合は、この質問を参照して適切なIISディレクトリを取得する方法を参照してください。Can I use reflection to find the bin/[Configuration] folder in ASP.NET instead of the asp temporary folder Microsoftの記事から

例:

[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; 
    } 

    ... 
}