0

このクラスは、Silverlightアプリによって消費されるWebサービスによって提供されています(それが適切かどうかはわかりません)

[Serializable]
public class Entry
{
    private string _title;

    public string Id { get; set; }
    public string Title { get { return _title; } set { _title = value; } }
    public string Link { get; set; }
    public DateTime Published { get; set; }
    public DateTime Updated { get; set; }
    public User User { get; set; }
    public Service Service { get; set; }
    public List<Comment> Comments { get; set; }
    public List<Like> Likes { get; set; }
    public List<Media> Media { get; set; }
}

何が問題になっているのかを示すために追加した_title変数。SilverlightアプリでWebサービスを参照すると、次のxsdが生成されます。

  <xs:complexType name="Entry">
    <xs:sequence>
      <xs:element name="_title" nillable="true" type="xs:string" />
      <xs:element name="_x003C_Comments_x003E_k__BackingField" nillable="true" type="tns:ArrayOfComment" />
      <xs:element name="_x003C_Id_x003E_k__BackingField" nillable="true" type="xs:string" />
      <xs:element name="_x003C_Likes_x003E_k__BackingField" nillable="true" type="tns:ArrayOfLike" />
      <xs:element name="_x003C_Link_x003E_k__BackingField" nillable="true" type="xs:string" />
      <xs:element name="_x003C_Media_x003E_k__BackingField" nillable="true" type="tns:ArrayOfMedia" />
      <xs:element name="_x003C_Published_x003E_k__BackingField" type="xs:dateTime" />
      <xs:element name="_x003C_Service_x003E_k__BackingField" nillable="true" type="tns:Service" />
      <xs:element name="_x003C_Updated_x003E_k__BackingField" type="xs:dateTime" />
      <xs:element name="_x003C_User_x003E_k__BackingField" nillable="true" type="tns:User" />
    </xs:sequence>
  </xs:complexType>

タイトルプロパティのみに名前が付けられていることに注意してください。他<Link>_BackingFieldの名前は、プロパティの名前に<または>を含めることができないため、要素をロードしようとすると完全に消滅します。

パブリックプロパティではなく、バッキングフィールドをシリアル化するのはなぜですか?

4

2 に答える 2

3

この記事で説明されているDataContractSerializerように、属性と組み合わせて (WCF の既定のシリアライザー)を使用するSerializableと、すべてのフィールド (パブリック フィールドとプライベート フィールド) がシリアル化されます。あなたのケースではバッキング フィールドが自動生成されるため、コンパイラは、作成する可能性のあるフィールド名と競合する可能性がない面白い名前を考え出します (C# は識別子で "<" または ">" を受け入れない場合がありますが、CLRそれほどうるさいわけではありません)。

おそらく、この状況を修正する最も簡単な方法は、必要に応じてクラスDataContractDataMember属性を追加することです。Entry

于 2009-05-04T15:11:10.007 に答える
1

自動プロパティを使用しないでください。書く代わりに:

public string Id { get; set; }

書きます:

string id;
public string Id { get { return id;} set {id = value;} }

自動プロパティの場合、バッキング フィールドのみがシリアル化されるため、奇妙な名前が付けられます。

于 2009-05-04T15:09:50.353 に答える