Exempel på DataContractSerializer
Exemplet DataContractSerializer visar DataContractSerializer, som utför allmänna serialiserings- och deserialiseringstjänster för datakontraktsklasserna. Exemplet skapar ett Record
objekt, serialiserar det till en minnesström och deserialiserar minnesströmmen tillbaka till ett annat Record
objekt för att demonstrera användningen av DataContractSerializer. Exemplet serialiserar Record
sedan objektet med hjälp av en binär skrivare för att visa hur skrivaren påverkar serialiseringen.
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Datakontraktet för Record
visas i följande exempelkod.
[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}";
}
}
Exempelkoden skapar ett Record
objekt med namnet record1
och visar sedan objektet.
Record record1 = new Record(1, 2, "+", 3);
Console.WriteLine("Original record: {0}", record1.ToString());
Exemplet använder DataContractSerializer sedan för att serialisera record1
till en minnesström.
MemoryStream stream1 = new MemoryStream();
//Serialize the Record object to a memory stream using DataContractSerializer.
DataContractSerializer serializer = new DataContractSerializer(typeof(Record));
serializer.WriteObject(stream1, record1);
Sedan använder DataContractSerializer exemplet för att deserialisera minnesströmmen tillbaka till ett nytt Record
objekt och visar den.
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());
Som standard kodar objekten DataContractSerializer
till en ström med hjälp av en textrepresentation av XML. Du kan dock påverka kodningen av XML genom att skicka in en annan skrivare. Exemplet skapar en binär skrivare genom att anropa CreateBinaryWriter. Den skickar sedan skrivaren och postobjektet till serialiseraren när den anropar WriteObjectContent. Slutligen rensar exemplet skrivaren och rapporterar om längden på strömmarna.
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);
När du kör exemplet visas den ursprungliga posten och den deserialiserade posten, följt av jämförelsen mellan längden på textkodningen och den binära kodningen. Tryck på RETUR i klientfönstret för att stänga av klienten.
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.
Så här konfigurerar du, skapar och kör exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Om du vill köra exemplet startar du klienten från kommandotolken genom att skriva client\bin\client.exe.