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 数据合同的主要内容,如果未能解决你的问题,请参考以下文章