对于 DataContractSerializer 如何处理序列化,您有几个选择:
- 什么都不做——如果没有关于 [DataContract] 或 [DataMember] 的声明,.NET 4.0 和更高版本中的默认行为是发送所有公共成员。
- 将 DeletableEntity 声明为 [DataContract] 并声明可序列化的 [DataMembers]。一旦你说了什么,WCF 就会假设你想说更多。
你可能想做#2。完成此操作后,如果您有任何采用 DeletableEntity 及其派生类型的 WCF 方法,请添加 [KnownTypes] 属性。您可能只想使用传递静态方法名称的 KnownTypes 的字符串版本。然后,静态方法可以使用程序集上的反射来提取从 DeletableEntity 派生的所有类型,以便该方法捕获在您编码时添加的任何新项目。
如果您想要以上内容,我推荐以下代码:
[DataContract]
[KnownType("GetKnownTypes")]
public abstract class DeletableEntity
{
[DataMember]
public bool Delete { get; set; }
public static Type[] GetKnownTypes()
{
return (from type in typeof (DeletableEntity).Assembly.GetTypes()
where typeof (DeletableEntity).IsAssignableFrom(type)
select type).ToArray();
}
}