Domanda

Ho un servizio WCF ospitato per client interni - abbiamo il controllo di tutti i client. Utilizzeremo quindi una libreria di contratti di dati per annullare la necessità di generazione di proxy. Vorrei usare alcune proprietà di sola lettura e avere alcuni contratti dati senza costruttori predefiniti. Grazie per l'aiuto ...

È stato utile?

Soluzione

Le proprietà di sola lettura vanno bene finché si contrassegna il campo (non di sola lettura) come [DataMember], non la proprietà. A differenza di XmlSerializer, IIRC DataContractSerializer non utilizza il ctor predefinito, ma utilizza un meccanismo di riflessione separato per creare istanze non inizializzate. Ad eccezione di mono " Olive " (Porta WCF), dove utilizza utilizza il ctor predefinito (al momento o ad un certo punto nel recente passato).

Esempio:

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top