2008-10-05 9 views
12

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 negar la necesidad de generación de proxy. Me gustaría usar algunas propiedades de solo lectura y tener algunos datos sin constructores por defecto. Gracias por su ayuda ...WCF DataContracts

Respuesta

24

Las propiedades de solo lectura están bien siempre que marque el campo (no de solo lectura) como [DataMember], no la propiedad. A diferencia de XmlSerializer, IIRC DataContractSerializer no utiliza el ctor predeterminado: utiliza un mecanismo de reflexión separado para crear instancias no inicializadas. Excepto en el "Olive" de mono (puerto WCF), donde hace use 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); 
    } 
} 
+0

Ok, que tiene sentido. No pude encontrar ninguna documentación sobre eso y pensé que había leído que se necesitaba un constructor predeterminado. Esto funciona genial! Gracias ... –

+2

esto está bien si tiene una propiedad de respaldo simple, pero ¿y si la propiedad de solo lectura es algo así como cadena pública FooBar {get {return Foo + '' + Bar; }} ¿cómo maneja el serializador de contrato de datos esa situación? – lomaxx

+0

@lomaxx, bueno, a menos que lo marque '[DataMember]', no hará nada; pero esa es una propiedad de solo lectura, así que espero que lo ignore o arroje una excepción. Si tiene un getter y setter, hará lo que su código le pida que haga. –

Cuestiones relacionadas