DataContractSerializer サンプル
DataContractSerializer サンプルでは、DataContractSerializer を示して、データ コントラクト クラスに対応した一般的なシリアル化および逆シリアル化の各サービスを実行します。 このサンプルでは、DataContractSerializer の使用方法を示すため、Record
オブジェクトを作成してメモリ ストリームにシリアル化し、そのメモリ ストリームを別の Record
オブジェクトに逆シリアル化します。 サンプルではその後、バイナリ ライタを使用して Record
オブジェクトをシリアル化し、バイナリ ライタがシリアル化にどのように影響するかを示します。
Note
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。
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}";
}
}
このサンプル コードは Record
という record1
オブジェクトを作成し、これを表示します。
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 を呼び出す際に、このライタと Record オブジェクトをシリアライザに渡します。 最後に、ライタをフラッシュしてストリームの長さを報告します。
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);
このサンプルを実行すると、元の Record オブジェクトと逆シリアル化された Record オブジェクトが表示され、続いてテキスト エンコーディングの長さとバイナリ エンコーディングの長さとが比較されます。 クライアントをシャットダウンするには、クライアント ウィンドウで 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.
サンプルをセットアップ、ビルド、および実行するには
Windows Communication Foundation サンプルの 1 回限りのセットアップの手順を実行したことを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「 Building the Windows Communication Foundation Samples」の手順に従います。
このサンプルを実行するには、コマンド プロンプトで「client\bin\client.exe」と入力してクライアントを開始します。