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 string.Format("Record: {0} {1} {2} = {3}", n1,            operation, n2, result);
    }
}

该示例代码创建一个名为 record1Record 对象,然后显示该对象。

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

然后示例使用 DataContractSerializerrecord1 序列化为内存流。

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 示例的一次性安装过程

  2. 若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。

  3. 若要启动该示例,请通过在命令提示符处键入 client\bin\client.exe 启动客户端。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.