次の方法で共有


XMLSerializer サンプル

XmlSerializer サンプルでは、XmlSerializerと互換性のある型をシリアル化および逆シリアル化する方法を示します。 既定の Windows Communication Foundation (WCF) フォーマッタは、 DataContractSerializer クラスです。 XmlSerializer クラスを使用できない場合は、DataContractSerializer クラスを使用して型をシリアル化および逆シリアル化できます。 これは、XML を正確に制御する必要がある場合によくあります。たとえば、データの一部が XML 要素ではなく XML 属性である必要がある場合などです。 また、多くの場合、WCF 以外のサービスのクライアントを作成するときに、 XmlSerializer が自動的に選択されます。

このサンプルでは、クライアントはコンソール アプリケーション (.exe) であり、サービスはインターネット インフォメーション サービス (IIS) によってホストされています。

このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。

次のサンプル コードに示すように、 ServiceContractAttributeXmlSerializerFormatAttribute をインターフェイスに適用する必要があります。

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples"), XmlSerializerFormat]
public interface IXmlSerializerCalculator
{
    [OperationContract]
    ComplexNumber Add(ComplexNumber n1, ComplexNumber n2);
    [OperationContract]
    ComplexNumber Subtract(ComplexNumber n1, ComplexNumber n2);
    [OperationContract]
    ComplexNumber Multiply(ComplexNumber n1, ComplexNumber n2);
    [OperationContract]
    ComplexNumber Divide(ComplexNumber n1, ComplexNumber n2);
}

ComplexNumber クラスのパブリック メンバーは、xml 属性としてXmlSerializerによってシリアル化されます。 DataContractSerializerを使用して、この種の XML インスタンスを作成することはできません。

public class ComplexNumber
{
    private double real;
    private double imaginary;

    [XmlAttribute]
    public double Real
    {
        get { return real; }
        set { real = value; }
    }

    [XmlAttribute]
    public double Imaginary
    {
        get { return imaginary; }
        set { imaginary = value; }
    }

    public ComplexNumber(double real, double imaginary)
    {
        this.Real = real;
        this.Imaginary = imaginary;
    }
    public ComplexNumber()
    {
        this.Real = 0;
        this.Imaginary = 0;
    }

}

サービス実装は、適切な結果を計算して返します。 ComplexNumber 型の値を受け入れて返します。

public class XmlSerializerCalculatorService : IXmlSerializerCalculator
{
    public ComplexNumber Add(ComplexNumber n1, ComplexNumber n2)
    {
        return new ComplexNumber(n1.Real + n2.Real, n1.Imaginary +
                                                      n2.Imaginary);
    }
    …
}

クライアント実装では、複素数も使用されます。 サービス コントラクトとデータ型の両方が、 サービス メタデータから ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) によって生成されたgeneratedClient.cs ソース ファイルで定義されます。 Svcutil.exe は、コントラクトが DataContractSerializer によってシリアル化できない場合を検出し、この場合は XmlSerializable 型の出力に戻すことができます。 XmlSerializerを強制的に使用する場合は、/serializer:XmlSerializer (Use XmlSerializer) コマンド オプションを Svcutil.exe ツールに渡します。

// Create a client.
XmlSerializerCalculatorClient client = new
                         XmlSerializerCalculatorClient();

// Call the Add service operation.
ComplexNumber value1 = new ComplexNumber();
value1.Real = 1;
value1.Imaginary = 2;
ComplexNumber value2 = new ComplexNumber();
value2.Real = 3;
value2.Imaginary = 4;
ComplexNumber result = client.Add(value1, value2);
Console.WriteLine("Add({0} + {1}i, {2} + {3}i) = {4} + {5}i",
    value1.Real, value1.Imaginary, value2.Real, value2.Imaginary,
    result.Real, result.Imaginary);
    …
}

サンプルを実行すると、操作要求と応答がクライアント コンソール ウィンドウに表示されます。 クライアント ウィンドウで Enter キーを押して、クライアントをシャットダウンします。

Add(1 + 2i, 3 + 4i) = 4 + 6i
Subtract(1 + 2i, 3 + 4i) = -2 + -2i
Multiply(2 + 3i, 4 + 7i) = -13 + 26i
Divide(3 + 7i, 5 + -2i) = 0.0344827586206897 + 1.41379310344828i

Press <ENTER> to terminate client.

サンプルを設定、ビルド、実行するには

  1. Windows Communication Foundation サンプル One-Time セットアップ手順を実行していることを確認します。

  2. ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  3. 単一または複数のコンピューター間の構成でサンプルを実行するには、「Windows Communication Foundation Samplesの実行」の手順に従います。