WCF DataContracts
-
05-07-2019 - |
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 ...
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);
}
}