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}";
}
}
示例代码创建一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时将编写器和记录对象传递给序列化程序。 最后,示例刷新编写器并报告流的长度。
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.
设置、生成和运行示例
确保已为 Windows Communication Foundation 示例 执行One-Time 安装过程。
若要生成解决方案的 C# 或 Visual Basic .NET 版本,请按照 生成 Windows Communication Foundation 示例中的说明进行操作。
若要运行示例,请通过键入客户端\bin\client.exe从命令提示符启动客户端。