【发布时间】:2010-09-15 10:04:41
【问题描述】:
我有一个为内部客户端托管的 WCF 服务 - 我们可以控制所有客户端。因此,我们将使用数据合约库来消除对代理生成的需求。我想使用一些只读属性并有一些没有默认构造函数的数据合同。 感谢您的帮助...
【问题讨论】:
标签: .net wcf datacontract serialization
我有一个为内部客户端托管的 WCF 服务 - 我们可以控制所有客户端。因此,我们将使用数据合约库来消除对代理生成的需求。我想使用一些只读属性并有一些没有默认构造函数的数据合同。 感谢您的帮助...
【问题讨论】:
标签: .net wcf datacontract serialization
只要您将(非只读)字段标记为 [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);
}
}
【讨论】:
[DataMember],否则它什么也不会做;但这是一个只读属性,所以我希望它要么忽略你,要么抛出异常。如果你有一个 getter 和 setter,它会做你的代码要求它做的任何事情。