Pergunta

Eu tenho um serviço WCF hospedado para clientes internos - nós temos o controle de todos os clientes. Vamos, portanto, estar usando uma biblioteca de contratos de dados para negar a necessidade de geração de proxy. Eu gostaria de usar algumas propriedades somente leitura e ter algumas DataContracts sem construtores padrão. Obrigado pela sua ajuda ...

Foi útil?

Solução

propriedades somente leitura de são muito bem contanto que você marque o campo (não somente leitura) como o [DataMember], não a propriedade. Ao contrário de XmlSerializer, IIRC DataContractSerializer não usa o ctor padrão - ele usa um mecanismo de reflexão separado para criar instâncias não inicializadas. Exceto em " Olive " (porta WCF) de mono, onde faz usar o ctor padrão (no momento, ou em algum momento no passado recente).

Exemplo:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top