我的这个类是由一个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;以财产的名义。
为什么要序列化支持字段而不是公共属性?
答案 0 :(得分:3)
如this article中所述,当您使用DataContractSerializer
(WCF的默认序列化程序)与Serializable
属性结合使用时,行为是所有字段,公共和私有,是序列化的。因为在您的情况下自动生成支持字段,编译器会提供有趣的名称,这些名称不会与您可能创建的任何字段名称冲突(C#可能不接受标识符中的“&lt;”或“&gt;”但是CLR并不那么挑剔。)
纠正这种情况的最简单方法可能是在DataContract
类中添加DataMember
和Entry
属性。
答案 1 :(得分:1)
不要使用自动属性。 而不是写:
public string Id { get; set; }
写:
string id;
public string Id { get { return id;} set {id = value;} }
如果是自动属性,只有后备字段被序列化,这就是你得到奇怪名字的原因。