2008-10-05 4 views
12

У меня есть служба WCF для внутренних клиентов - у нас есть контроль над всеми клиентами. Поэтому мы будем использовать библиотеку контрактов данных, чтобы отрицать необходимость генерации прокси. Я хотел бы использовать некоторые свойства readonly и иметь некоторые datacontracts без конструкторов по умолчанию. Спасибо за вашу помощь ...WCF DataContracts

ответ

24

Свойства 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); 
    } 
} 
+0

Хорошо, что имеет смысл. Я не мог найти документацию по этому поводу и думал, что прочитал, что необходим конструктор по умолчанию. Это отлично работает! Спасибо ... – 2008-10-05 21:36:41

Смежные вопросы