65.9K
CodeProject 正在变化。 阅读更多。
Home

WCF 序列化

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (2投票s)

2009 年 2 月 9 日

CPOL
viewsIcon

41382

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 都会为空。

你可以在服务器端的复杂类型构造函数上设置断点:
但它永远不会在那里停止。

© . All rights reserved.