DataContractAttribute的基础知识

jp2*_*ode 3 c# wcf datacontract datacontractserializer

我正在看微软的如何:为类或结构创建基本数据合同,但它给我留下了很多问题.

他们提供了这个非常简单的例子:

using System;
using System.Runtime.Serialization;

[DataContract]
public class Person
{
  // This member is serialized.
  [DataMember]
  internal string FullName;

  // This is serialized even though it is private.
  [DataMember]
  private int Age;

  // This is not serialized because the DataMemberAttribute 
  // has not been applied.
  private string MailingAddress;

  // This is not serialized, but the property is.
  private string telephoneNumberValue;

  [DataMember]
  public string TelephoneNumber
  {
    get { return telephoneNumberValue; }
    set { telephoneNumberValue = value; }
  }
}
Run Code Online (Sandbox Code Playgroud)

对于我的情况,我需要这个还包括另一个名为ADUser(Active Directory用户)的自定义类对象.

我明白ADUser必须标记DataContractAttribute,但我不明白究竟是怎么回事.

这是微软的课程,但这一次ADUser添加了字段:

using System;
using System.Runtime.Serialization;

[DataContract]
public class Person
{
  // This member is serialized.
  [DataMember]
  internal string FullName;

  // This is serialized even though it is private.
  [DataMember]
  private int Age;

  // This is not serialized because the DataMemberAttribute 
  // has not been applied.
  private string MailingAddress;

  // This is not serialized, but the property is.
  private string telephoneNumberValue;

  [DataMember]
  public string TelephoneNumber
  {
    get { return telephoneNumberValue; }
    set { telephoneNumberValue = value; }
  }

  [DataMember]
  public ADUser UserInfo { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

我真的不明白我的ADUser班级需要做什么或者做什么,但我确信这些private东西可以不受影响.

我怎么需要修复这个ADUser类示例?

public class ADUser
{

  private string first, last, loginID;

  public ADUser() {
    first = null;
    last = null;
    loginID = null;
  }

  private void getInfo() {
    // code goes here
    // which sets loginID;
  }

  public void SetName(string first, string last) {
    this.first = first;
    this.last = last;
    getInfo();
  }

  public string LoginID { get { return loginID; } }

}
Run Code Online (Sandbox Code Playgroud)

evg*_*nyl 5

正如@outcoldman@EthanLi建议:

  1. [DataContract]属性添加到ADUser类中.

  2. 添加不带参数的公共构造函数.

  3. 选择要通过WCF的字段.用[DataMember]属性标记所有这些标记.

  4. 在序列化期间只有getter的属性将失败:所有公开的属性都应该同时具有getter和(public!)setter.因此,例如,LoginID如果您尝试将[DataMember]属性应用于此属性,则属性将失败.在这种情况下,请考虑将其更改为方法.