2008-10-05 12 views
12

Ich habe einen WCF-Dienst für interne Clients gehostet - wir haben die Kontrolle über alle Clients. Wir werden daher eine Bibliothek für Datenverträge verwenden, um die Notwendigkeit der Proxy-Generierung zu umgehen. Ich möchte einige Readonly-Eigenschaften verwenden und einige Datenkontrakte ohne Standardkonstruktoren haben. Danke für Ihre Hilfe ...WCF DataContracts

Antwort

24

Readonly-Eigenschaften sind in Ordnung, solange Sie das (nicht schreibgeschützte) Feld als [DataMember] markieren, nicht die Eigenschaft. Im Gegensatz zu XmlSerializer verwendet IIRC DataContractSerializer nicht den Standard-Ctor - es verwendet einen separaten Reflektionsmechanismus, um nicht initialisierte Instanzen zu erstellen. Außer auf Monos "Olive" (WCF-Port), wo es tut verwenden Sie die Standard-Ctor (im Moment oder zu einem Zeitpunkt in der jüngsten Vergangenheit).

Beispiel:

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, das macht Sinn. Ich konnte keine Dokumentation darüber finden und dachte, ich hätte gelesen, dass ein Standardkonstruktor benötigt wurde. Das funktioniert großartig! Danke ... –

+2

Das ist in Ordnung, wenn Sie eine einfache Backing-Eigenschaft haben, aber was ist, wenn die readonly-Eigenschaft etwas wie public string ist FooBar {get {return Foo + '' + Bar; }} Wie geht der DataContract-Serializer mit dieser Situation um? – lomaxx

+0

@lomaxx, naja, wenn Sie es nicht markieren [DataMember] ', wird es nichts tun; aber das ist eine schreibgeschützte Eigenschaft, also erwarte ich, dass sie Sie ignoriert oder eine Ausnahme auslöst. Wenn Sie einen Getter und Setter haben, wird es tun, was auch immer Ihr Code von Ihnen verlangt. –