3

Microsoft の How to: Create a Basic Data Contract for a Class or Structureを見ていますが、多くの疑問が残ります。

彼らはこの非常に単純な例を提供します:

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; }
  }
}

私の場合、ADUser(Active Directory User) という別のカスタム クラス オブジェクトも含める必要があります。

ADUserでマークする必要があることは理解してDataContractAttributeいますが、正確にそれを行う方法がわかりません。

これも Microsoft のクラスですが、今回は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; }

}

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; } }

}
4

1 に答える 1

5

@outcoldmanと@EthanLiが提案しように:

  1. [DataContract]クラスに属性を追加しますADUser

  2. 引数なしでパブリックコンストラクターを追加します。

  3. WCF を介して渡すフィールドを選択します。[DataMember]それらすべてを属性でマークします。

  4. ゲッターのみのプロパティは、シリアル化中に失敗します。公開されたすべてのプロパティには、ゲッターと (パブリック!) セッターの両方が必要です。したがって、たとえば、属性をLoginID適用しようとすると、プロパティは失敗します[DataMember]。この場合、メソッドに変更することを検討してください。

于 2013-04-11T04:40:44.450 に答える