Ejemplo de XMLSerializer
El ejemplo XMLSerializer muestra el procedimiento para serializar y deserializar tipos que sean compatibles con XmlSerializer. El formateador predeterminado de Windows Communication Foundation (WCF) es la clase DataContractSerializer. Se puede usar la clase XmlSerializer para serializar y deserializar los tipos cuando no se puede utilizar la clase DataContractSerializer. Éste es a menudo el caso cuando se requiere el control preciso sobre XML; por ejemplo, si un dato debe ser un atributo XML y no un elemento XML. Además, se suele seleccionar XmlSerializer automáticamente cuando se crean clientes para servicios que no son de WCF.
En este ejemplo, el cliente es una aplicación de consola (.exe) y los Servicios de Internet Information Server (IIS) hospedan el servicio.
Nota
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.
ServiceContractAttribute y XmlSerializerFormatAttribute se deben aplicar a la interfaz tal y como se muestra en el código de muestra siguiente.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples"), XmlSerializerFormat]
public interface IXmlSerializerCalculator
{
[OperationContract]
ComplexNumber Add(ComplexNumber n1, ComplexNumber n2);
[OperationContract]
ComplexNumber Subtract(ComplexNumber n1, ComplexNumber n2);
[OperationContract]
ComplexNumber Multiply(ComplexNumber n1, ComplexNumber n2);
[OperationContract]
ComplexNumber Divide(ComplexNumber n1, ComplexNumber n2);
}
ComplexNumber
serializa los miembros públicos de la clase XmlSerializer como atributos XML. DataContractSerializer no se puede utilizar para crear este tipo de instancia XML.
public class ComplexNumber
{
private double real;
private double imaginary;
[XmlAttribute]
public double Real
{
get { return real; }
set { real = value; }
}
[XmlAttribute]
public double Imaginary
{
get { return imaginary; }
set { imaginary = value; }
}
public ComplexNumber(double real, double imaginary)
{
this.Real = real;
this.Imaginary = imaginary;
}
public ComplexNumber()
{
this.Real = 0;
this.Imaginary = 0;
}
}
La implementación del servicio calcula y devuelve los resultados adecuados, aceptando y devolviendo valores del tipo ComplexNumber
.
public class XmlSerializerCalculatorService : IXmlSerializerCalculator
{
public ComplexNumber Add(ComplexNumber n1, ComplexNumber n2)
{
return new ComplexNumber(n1.Real + n2.Real, n1.Imaginary +
n2.Imaginary);
}
…
}
La implementación del cliente también utiliza números complejos. El contrato de servicio y los tipos de datos se definen en el archivo de código fuente generatedClient.cs, que había generado la utilidad de metadatos de ServiceModel (Svcutil.exe) a partir de los metadatos del servicio. Svcutil.exe puede detectar cuándo no es serializable un contrato por DataContractSerializer y vuelve a tipos de XmlSerializable
emisores en este caso. Si desea forzar el uso de XmlSerializer, puede pasar la opción de comando /serializer:XmlSerializer (utilice XmlSerializer) a la herramienta Svcutil.exe.
// Create a client.
XmlSerializerCalculatorClient client = new
XmlSerializerCalculatorClient();
// Call the Add service operation.
ComplexNumber value1 = new ComplexNumber();
value1.Real = 1;
value1.Imaginary = 2;
ComplexNumber value2 = new ComplexNumber();
value2.Real = 3;
value2.Imaginary = 4;
ComplexNumber result = client.Add(value1, value2);
Console.WriteLine("Add({0} + {1}i, {2} + {3}i) = {4} + {5}i",
value1.Real, value1.Imaginary, value2.Real, value2.Imaginary,
result.Real, result.Imaginary);
…
}
Al ejecutar el ejemplo, las solicitudes y respuestas de la operación se muestran en la ventana de la consola del cliente. Presione ENTRAR en la ventana de cliente para cerrar el cliente.
Add(1 + 2i, 3 + 4i) = 4 + 6i
Subtract(1 + 2i, 3 + 4i) = -2 + -2i
Multiply(2 + 3i, 4 + 7i) = -13 + 26i
Divide(3 + 7i, 5 + -2i) = 0.0344827586206897 + 1.41379310344828i
Press <ENTER> to terminate client.
Configurar, compilar y ejecutar el ejemplo
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.
Para ejecutar el ejemplo en una configuración de una sola máquina o de varias máquinas, siga las instrucciones que se indican en Ejecución de los ejemplos de Windows Communication Foundation.