У меня есть служба WCF для внутренних клиентов - у нас есть контроль над всеми клиентами. Поэтому мы будем использовать библиотеку контрактов данных, чтобы отрицать необходимость генерации прокси. Я хотел бы использовать некоторые свойства readonly и иметь некоторые datacontracts без конструкторов по умолчанию. Спасибо за вашу помощь...
WCF DataContracts
Ответ 1
Свойства Readonly прекрасны до тех пор, пока вы помечаете (не-readonly) поле как [DataMember], а не свойство. В отличие от XmlSerializer, IIRC DataContractSerializer не использует по умолчанию ctor - он использует отдельный механизм отражения для создания неинициализированных экземпляров. За исключением моно " Olive" (порт WCF), где он использует значение по умолчанию ctor (на данный момент или в какой-то момент в недавнее прошлое).
Пример:
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);
}
}