Contratos de Datos de WCF
-
05-07-2019 - |
Pregunta
Tengo un servicio WCF alojado para clientes internos: tenemos el control de todos los clientes. Por lo tanto, utilizaremos una biblioteca de contratos de datos para anular la necesidad de generación de proxy. Me gustaría usar algunas propiedades de solo lectura y tener algunos contratos de datos sin constructores predeterminados. Gracias por tu ayuda ...
Solución
Las propiedades de solo lectura están bien siempre que marque el campo (no de solo lectura) como [DataMember], no como propiedad. A diferencia de XmlSerializer, IIRC DataContractSerializer no usa el ctor predeterminado, sino que utiliza un mecanismo de reflexión separado para crear instancias no inicializadas. Excepto en el " Olive " (Puerto WCF), donde sí usa el ctor predeterminado (en este momento, o en algún momento del pasado reciente).
Ejemplo:
using System;
using System.IO;
using System.Runtime.Serialization;
[DataContract]
class Foo
{
[DataMember(Name="Bar")]
private string bar;
public string Bar { get { return bar; } }
public Foo(string bar) { this.bar = bar; }
}
static class Program
{
static void Main()
{
DataContractSerializer dcs = new DataContractSerializer(typeof(Foo));
MemoryStream ms = new MemoryStream();
Foo orig = new Foo("abc");
dcs.WriteObject(ms, orig);
ms.Position = 0;
Foo clone = (Foo)dcs.ReadObject(ms);
Console.WriteLine(clone.Bar);
}
}