2009-05-04 11 views
0

このクラスは、Silverlightアプリケーションで消費されるWebサービスによって提供されています(関連性があるかどうかわかりません).NET WebサービスのSilverlightシリアル化によってXMLエラーが発生する

[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サービスを参照する場合、それはfolowingの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を命名されていますプロパティ名に<または>を付けることはできません。

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

答えて

3

としてはthis articleで説明しますが、Serializable属性との組み合わせでDataContractSerializer(WCFのデフォルト・シリアライザ)を使用する場合、動作は、パブリックとプライベートのすべてのフィールドは、シリアル化されるということです。あなたのケースではバッキングフィールドが自動的に生成されるので、コンパイラは作成するフィールド名と競合することのない面白い名前を思いつきます(C#では識別子に "<"または ">"を使用できませんが、CLRそれほど嫌なことではない)。

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

1

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

public string Id { get; set; } 

書き込み:自動プロパティのみバックアップフィールドの場合

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

がシリアライズされます、あなたは奇妙な名前を取得理由です。

関連する問題