C# 使用DataContractSerializer序列化重写的属性
我在基中有一个abstract属性,它被两个派生类覆盖。我希望为其中一个而不是另一个序列化属性:C# 使用DataContractSerializer序列化重写的属性,c#,.net,inheritance,datacontractserializer,composite,C#,.net,Inheritance,Datacontractserializer,Composite,我在基中有一个abstract属性,它被两个派生类覆盖。我希望为其中一个而不是另一个序列化属性: [Serializable] [DataContract(IsReference = true)] public abstract class Component { public abstract bool IsSelected { get; set; } } [Serializable] [DataContract] public class Leaf : Component {
[Serializable]
[DataContract(IsReference = true)]
public abstract class Component
{
public abstract bool IsSelected { get; set; }
}
[Serializable]
[DataContract]
public class Leaf : Component
{
[DataMember]
public override bool IsSelected { get; set; } // serialized
}
[Serializable]
[DataContract]
public class Composite : Component
{
private List<Component> componentList = new List<Component>();
/// <summary>
/// Should *not* be serialized
/// </summary>
public override bool IsSelected
{
get
{
foreach (Component component in componentList)
{
if (!component.IsSelected)
return false;
}
return true;
}
set
{
foreach (Component component in componentList)
component.IsSelected = value;
}
}
}
[可序列化]
[DataContract(IsReference=true)]
公共抽象类组件
{
公共抽象布尔值{get;set;}
}
[可序列化]
[数据合同]
公共类叶:组件
{
[数据成员]
public override bool IsSelected{get;set;}//序列化
}
[可序列化]
[数据合同]
公共类复合:组件
{
私有列表组件列表=新列表();
///
///是否应*不*序列化
///
公众压倒布尔当选
{
得到
{
foreach(组件列表中的组件)
{
如果(!component.IsSelected)
返回false;
}
返回true;
}
设置
{
foreach(组件列表中的组件)
component.IsSelected=值;
}
}
}
我认为将[DataMember]属性放在Leaf的'IsSelected'属性上就足够了,但显然,甚至连Leaf的属性都没有序列化
谢谢 您还需要在组合和组件类的IsSelected属性上添加
[DataMember]
属性。试试看。我在Reflector中深入研究了这一点,查看了4.0.0.0版本的System.Runtime.Serialization
,似乎生成序列化协定的代码明确忽略了从某个基类重写的属性。因此,在您的示例中,运行时是显式地故意不序列化Leaf.IsSelected
我怀疑这样做是因为他们不想检查基类(或某些中间祖先类)是否也要序列化属性。如果是这种情况,您可能最终会序列化属性的多个值,这可能是不需要的
和往常一样,我们不应该过分依赖Reflector显示的内容,因为代码总是可以更改的,但至少我们知道它是故意这样做的
如果其他人正在查看,代码是
ClassDataContract.ClassDataContractCriticalHelper
中的ImportDataMembers
函数。为什么要同时应用serializable和datacontract?但我不希望该组合序列化任何内容!为什么您关心Composite.IsSelected是否序列化?