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());
根據預設,會使用 XML 的文字表示,將 DataContractSerializer 物件編碼成數據流。 不過,您可以使用不同的寫入器,以更改 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.