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 ...

¿Fue útil?

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 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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top