WCF 序列化





1.00/5 (2投票s)
WCF 序列化不调用构造函数

引言
这篇文章主要讨论 WCF 序列化的一些令人惊讶的行为。
如你所知,将复杂类型作为参数传递给 WCF 时,将会使用 DataContractSerializer 进行序列化。
序列化过程中需要注意的一点是,与 XmlSerializer 不同,它不会调用构造函数或字段初始化。
本文的代码示例可在此处找到:这里
具体内容
如果你声明以下契约:
[DataContract] public class MyCompositeType { private Guid m_id1 = Guid.NewGuid ();"COLOR: #009900"> // will not happens during serialization public MyCompositeType () "COLOR: #009900">// will not happens during serialization { Id2 = Guid.NewGuid (); } public Guid Id1 { get { return m_id1; } } public Guid Id2 { get; private set; } [DataMember] public string StringValue { get; set; } }
不要期望 ids(不是数据成员)在序列化过程的另一端被初始化。
如果我们有以下服务实现:
public MyCompositeType GetDataUsingDataContract ( MyCompositeType composite ) { composite.StringValue += " : " + composite.Id1.ToString () + " : " + composite.Id2.ToString (); return composite; }
从客户端调用它看起来像这样:
static void Main ( string[] args ) { MyProxy.SampleServiceClient svc = new MyProxy.SampleServiceClient (); var composite = new MyCompositeType { StringValue = "Test" }; Console.WriteLine ("Id1 = {0} \nId2 = {1}", composite.Id1.ToString (), composite.Id2.ToString ()); var response = svc.GetDataUsingDataContract (composite); Console.WriteLine (response.StringValue); Console.WriteLine ("Id1 = {0} \nId2 = {1}", response.Id1.ToString (), response.Id2.ToString ()); Console.ReadLine (); }
ids 仅在客户端被初始化为非空 Guid。
在服务器端和响应中,ids 都会为空。
你可以在服务器端的复杂类型构造函数上设置断点:
但它永远不会在那里停止。