WCF 数据合同

Posted

技术标签:

【中文标题】WCF 数据合同【英文标题】:WCF DataContracts 【发布时间】:2010-09-15 10:04:41 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

好的,这很有道理。我找不到任何关于此的文档,并认为我已经阅读过需要默认构造函数。这很好用!谢谢... 如果你有一个简单的后备属性,这很好,但如果只读属性类似于 public string FooBar get return Foo + ' ' + Bar; datacontract 序列化程序如何处理这种情况? @lomaxx,好吧,除非你把它标记为[DataMember],否则它什么也不会做;但这是一个只读属性,所以我希望它要么忽略你,要么抛出异常。如果你有一个 getter 和 setter,它会做你的代码要求它做的任何事情。 仅供参考,DataContractSerializer 有一个 SerializeReadOnlyTypes 设置(从框架 4.5 开始)msdn.microsoft.com/en-us/library/…

以上是关于WCF 数据合同的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据合同 WCF 中使用枚举

WCF - 在合同列表中找不到合同名称

有没有办法在 WCF 的数据合同中使用 DataMember 装饰多个属性?

找不到 WCF 合同名称“IMyService”?

WCF 双工合同

一个 WCF 服务中的多个合同_但调用第二个合同时出错