次の方法で共有


DataContractSerializer サンプル

DataContractSerializer サンプルでは、データ コントラクト クラスの一般的なシリアル化および逆シリアル化サービスを実行するDataContractSerializerを示します。 このサンプルでは、 Record オブジェクトを作成し、それをメモリ ストリームにシリアル化し、メモリ ストリームを別の Record オブジェクトに逆シリアル化して、 DataContractSerializerの使用方法を示します。 次に、バイナリ ライターを使用して Record オブジェクトをシリアル化し、ライターがシリアル化にどのように影響するかを示します。

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

Recordのデータ コントラクトを次のサンプル コードに示します。

[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
internal class Record
{
    private double n1;
    private double n2;
    private string operation;
    private double result;

    internal Record(double n1, double n2, string operation, double result)
    {
        this.n1 = n1;
        this.n2 = n2;
        this.operation = operation;
        this.result = result;
    }

    [DataMember]
    internal double OperandNumberOne
    {
        get { return n1; }
        set { n1 = value; }
    }

    [DataMember]
    internal double OperandNumberTwo
    {
        get { return n2; }
        set { n2 = value; }
    }

    [DataMember]
    internal string Operation
    {
        get { return operation; }
        set { operation = value; }
    }

    [DataMember]
    internal double Result
    {
        get { return result; }
        set { result = value; }
    }

    public override string ToString()
    {
        return $"Record: {n1} {operation} {n2} = {result}";
    }
}

サンプル コードでは、record1という名前のRecord オブジェクトを作成し、そのオブジェクトを表示します。

Record record1 = new Record(1, 2, "+", 3);
Console.WriteLine("Original record: {0}", record1.ToString());

次に、このサンプルでは、 DataContractSerializer を使用して record1 をメモリ ストリームにシリアル化します。

MemoryStream stream1 = new MemoryStream();

//Serialize the Record object to a memory stream using DataContractSerializer.
DataContractSerializer serializer = new DataContractSerializer(typeof(Record));
serializer.WriteObject(stream1, record1);

次に、このサンプルでは、 DataContractSerializer を使用してメモリ ストリームを新しい Record オブジェクトに逆シリアル化し、表示します。

stream1.Position = 0;

//Deserialize the Record object back into a new record object.
Record record2 = (Record)serializer.ReadObject(stream1);

Console.WriteLine("Deserialized record: {0}", record2.ToString());

既定では、 DataContractSerializer は XML のテキスト表現を使用してオブジェクトをストリームにエンコードします。 ただし、別のライターを渡すことで、XML のエンコードに影響を与えることができます。 このサンプルでは、 CreateBinaryWriterを呼び出してバイナリ ライターを作成します。 その後、 WriteObjectContentを呼び出すときに、ライターとレコード オブジェクトをシリアライザーに渡します。 最後に、サンプルはライターをフラッシュし、ストリームの長さを報告します。

MemoryStream stream2 = new MemoryStream();

XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream2);
serializer.WriteObject(binaryDictionaryWriter, record1);
binaryDictionaryWriter.Flush();

//report the length of the streams
Console.WriteLine("Text Stream is {0} bytes long", stream1.Length);
Console.WriteLine("Binary Stream is {0} bytes long", stream2.Length);

サンプルを実行すると、元のレコードと逆シリアル化されたレコードが表示され、テキスト エンコードの長さとバイナリ エンコードの間の比較が続きます。 クライアント ウィンドウで Enter キーを押して、クライアントをシャットダウンします。

Original record: Record: 1 + 2 = 3
Deserialized record: Record: 1 + 2 = 3
Text Stream is 233 bytes long
Binary Stream is 156 bytes long

Press <ENTER> to terminate client.

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

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

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

  3. サンプルを実行するには、「client\bin\client.exe」と入力して、コマンド プロンプトからクライアントを起動します。