.net WCF数据合同

.net WCF数据合同,.net,wcf,datacontract,serialization,.net,Wcf,Datacontract,Serialization,我有一个为内部客户托管的WCF服务-我们可以控制所有客户。因此,我们将使用数据契约库来消除代理生成的需要。我想使用一些只读属性,并有一些没有默认构造函数的DataContract。 感谢您的帮助……只要将(非只读)字段标记为[DataMember],而不是属性,只读属性就可以了。与XmlSerializer不同,IIRC DataContractSerializer不使用默认的构造函数-它使用单独的反射机制来创建未初始化的实例。除了mono的“”(WCF端口)之外,它使用默认的ctor(目前或最

我有一个为内部客户托管的WCF服务-我们可以控制所有客户。因此,我们将使用数据契约库来消除代理生成的需要。我想使用一些只读属性,并有一些没有默认构造函数的DataContract。
感谢您的帮助……

只要将(非只读)字段标记为[DataMember],而不是属性,只读属性就可以了。与XmlSerializer不同,IIRC DataContractSerializer不使用默认的构造函数-它使用单独的反射机制来创建未初始化的实例。除了mono的“”(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);
    }
}

好的,这是有道理的。我找不到任何关于这个的文档,我想我已经读到需要一个默认构造函数。这太棒了!谢谢…如果您有一个简单的支持属性,这很好,但是如果readonly属性类似于公共字符串FooBar{get{return Foo+''''+Bar;}}那么datacontract序列化程序如何处理这种情况呢?@lomaxx,好吧,除非您将其标记为
[DataMember]
,否则它将不起任何作用;但这是一个只读属性,所以我希望它要么忽略您,要么抛出异常。如果您有一个getter和setter,它将执行代码要求它执行的任何操作。仅供参考,DataContractSerializer有一个SerializeReadOnlyTypes设置(从framework 4.5开始)