8

。ネット

私は Web サービスを持っています。メッセージのデータ メンバーの 1 つは IXmlSerializable を実装しています。「サービス参照の追加」を行うと、そのメンバーは DataSet になります。

Expression<TDelegate>シリアル化されたものをパラメーターとして Web サービスに渡そうとしています。

Q:クライアント側でインスタンスDataSetを作成するにはどうすればよいですか?IXmlSerializable

4

2 に答える 2

11

これは古い質問だと思いますが、将来の読者のために、私が発見したことを以下に示します。

実装するオブジェクトはIXmlSerializable、wsdl で動作するようにスキーマを定義する必要があります。そうしないと、シリアライゼーションがカスタムであるため、.Net フレームワークはコントラクトを定義する方法を認識しません。

スキーマを指定するには、IXmlSerializable インターフェイスで GetSchema メソッドを使用するのではなく、XmlSchemaProvider属性 ( msdn link ) を使用します。詳細については、Microsoft の記事「.NET Framework でスキーマ プロバイダーを使用して XML シリアル化を強化する」のスキーマ プロバイダー セクションを参照してください。

XmlSchemaProvider 属性ページと記事の両方で例を見つけることができます。スキーマを .xsd ファイルに保存し、例のように読み込むことをお勧めします。コードを介してスキーマを記述することは、せいぜい面倒です。

スキーマ プロバイダーを実装すると、シリアル化は期待どおりに機能しました。WCF サービスが IIS でホストされている場合は、反射を介して適切な IIS ディレクトリを取得する方法に関するこの質問を参照してください

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

    ...
}
于 2010-04-19T15:34:37.790 に答える
4

IXmlSerializable一般に、 SOAP または WCF を介したカスタム シリアライゼーション ( 経由) はお勧めできません。WCF でアセンブリ共有を使用している場合 (つまり、プロキシ生成ではなく、DTO アセンブリをクライアントに出荷する場合) は機能しますが、それでも SOA/mex などに違反します。あなたXmlElementまたは同様のものを与えますが、へー!

IXmlSerializable既存の ( ) オブジェクト モデルを、標準のシリアル化を使用できる単純な型 (つまり、 no )にマップするだけIXmlSerializableです。

ところで; ADO.NET Data Services を見たことがありますか? これはすでにExpressionワイヤーを介して処理されます (ただし、値としてではありません)。値として渡すには、MetaLinq .

于 2009-09-21T20:37:22.920 に答える