WCF数据契约

13

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

感谢您的帮助...

1个回答

26
只要将(非只读)字段标记为[DataMember]而不是属性,只读属性就可以使用。与XmlSerializer不同,我记得DataContractSerializer不使用默认的构造函数-它使用单独的反射机制来创建未初始化的实例。除了在mono的“Olive”(WCF端口)上,在那里它在此刻或最近的某个时间使用默认构造函数。

示例:

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);
    }
}

好的,这很有道理。我找不到任何关于这个的文档,以为需要一个默认构造函数。这很棒!谢谢... - Craig Wilson
2
如果您有一个简单的后备属性,那么这是可以的,但是如果只读属性像这样:public string FooBar { get {return Foo + ' ' + Bar; }},数据合同序列化程序如何处理这种情况? - lomaxx
@lomaxx,除非你标记为[DataMember],否则它什么也不会做;但那是只读属性,所以我预计它要么会忽略你,要么会抛出异常。如果你有getter和setter,它将执行你的代码要求它执行的任何操作。 - Marc Gravell
请注意,DataContractSerializer有一个SerializeReadOnlyTypes设置(从框架4.5开始)。https://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializersettings.serializereadonlytypes.aspx - Simon Mourier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接