.NET Web服务的Silverlight序列化导致XML错误

时间:2009-05-04 14:37:35

标签: silverlight web-services serialization wcf-binding

我的这个类是由一个Web服务提供的,然后由Silverlight应用程序使用(我不知道这是否相关)

[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>

请注意,只有title属性被命名,其他名称为<Link>_BackingField,当你尝试加载元素时它会完全消失,因为你不能拥有&lt;或者&gt;以财产的名义。

为什么要序列化支持字段而不是公共属性?

2 个答案:

答案 0 :(得分:3)

this article中所述,当您使用DataContractSerializer(WCF的默认序列化程序)与Serializable属性结合使用时,行为是所有字段,公共和私有,是序列化的。因为在您的情况下自动生成支持字段,编译器会提供有趣的名称,这些名称不会与您可能创建的任何字段名称冲突(C#可能不接受标识符中的“&lt;”或“&gt;”但是CLR并不那么挑剔。)

纠正这种情况的最简单方法可能是在DataContract类中添加DataMemberEntry属性。

答案 1 :(得分:1)

不要使用自动属性。 而不是写:

public string Id { get; set; }

写:

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

如果是自动属性,只有后备字段被序列化,这就是你得到奇怪名字的原因。