Esempio di DataContractSerializer
Nell'esempio relativo a DataContractSerializer viene illustrata la classe DataContractSerializer, che esegue servizi generali di serializzazione e di deserializzazione per le classi del contratto dati. L'esempio crea un oggetto Record
, lo serializza a un flusso di memoria e quindi deserializza il flusso di memoria a un altro oggetto Record
per illustrare l'uso di DataContractSerializer. L'esempio serializza quindi l'oggetto Record
usando un writer binario per illustrare come il writer influisce sulla serializzazione.
Nota
La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.
Il contratto dati per Record
viene illustrato nell'esempio di codice seguente.
[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}";
}
}
L'esempio di codice crea un oggetto Record
denominato record1
, quindi visualizza l'oggetto.
Record record1 = new Record(1, 2, "+", 3);
Console.WriteLine("Original record: {0}", record1.ToString());
L'esempio usa quindi DataContractSerializer per serializzare record1
in un flusso di memoria.
MemoryStream stream1 = new MemoryStream();
//Serialize the Record object to a memory stream using DataContractSerializer.
DataContractSerializer serializer = new DataContractSerializer(typeof(Record));
serializer.WriteObject(stream1, record1);
L'esempio usa quindi DataContractSerializer per deserializzare di nuovo il flusso di memoria in un nuovo oggetto Record
e lo visualizza.
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());
Per impostazione predefinita, DataContractSerializer
codifica gli oggetti in un flusso usando una rappresentazione testuale di XML. Tuttavia, è possibile influenzare la codifica del XML usando un writer diverso. Nell'esempio viene creato un writer binario chiamando CreateBinaryWriter. Il writer e l'oggetto record vengono quindi passati al serializzatore quando chiama WriteObjectContent. Infine, l'esempio scarica il writer e segnala la lunghezza dei flussi.
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);
Quando si esegue l'esempio, vengono visualizzati il record originale e il record deserializzato, seguiti dal confronto tra la lunghezza della codifica del testo e della codifica binaria. Premere INVIO nella finestra del client per arrestare il client.
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.
Per impostare, compilare ed eseguire l'esempio
Assicurarsi di aver eseguito la Procedura di installazione singola per gli esempi di Windows Communication Foundation.
Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Building the Windows Communication Foundation Samples.
Per eseguire l'esempio, avviare il client dal prompt dei comandi digitando client\bin\client.exe.