2008-10-05 12 views
12

J'ai un service WCF hébergé pour des clients internes - nous avons le contrôle de tous les clients. Nous allons donc utiliser une bibliothèque de contrats de données pour annuler le besoin de génération de proxy. Je voudrais utiliser des propriétés readonly et avoir des contrats de données sans constructeurs par défaut. Merci pour votre aide ...WCF DataContracts

Répondre

24

Les propriétés en lecture seule sont correctes tant que vous marquez le champ (non-readonly) en tant que [DataMember], pas la propriété. Contrairement à XmlSerializer, IIRC DataContractSerializer n'utilise pas le ctor par défaut - il utilise un mécanisme de réflexion séparé pour créer des instances non initialisées. Sauf sur le "Olive" (port WCF) du mono, où utilise utilise le ctor par défaut (à ce moment, ou à un moment donné dans le passé récent).

Exemple:

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

Ok, cela fait sens. Je n'ai trouvé aucune documentation à ce sujet et je pensais avoir lu qu'un constructeur par défaut était nécessaire. Cela fonctionne très bien! Merci ... –

+2

c'est bien si vous avez une propriété de sauvegarde simple mais si la propriété readonly est quelque chose comme chaîne publique FooBar {get {return Foo + '' + Bar; }} comment le sérialiseur datacontract gère-t-il cette situation? – lomaxx

+0

@lomaxx, eh bien, à moins que vous ne le marquiez '[DataMember]', il ne fera rien; mais c'est une propriété en lecture seule, donc je m'attends à ce que cela vous ignore ou lance une exception. Si vous avez un getter et un setter, il fera tout ce que votre code lui demande de faire. –