![](/img/trans.png)
[英]DataContractSerializer - How to serialize objects using ElementName instead of property name?
[英]Serialize overriden property with DataContractSerializer
我在基数中有一个absract属性,被2个派生类覆盖。 我希望为其中一个属性序列化属性,而不是其他属性:
[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;
}
}
}
我认为在Leaf的'IsSelected'属性上放置[DataMember]属性是足够的,但显然,甚至Leaf的属性都没有被序列化。
谢谢!
我在Reflector中挖掘了这个,查看了System.Runtime.Serialization
的4.0.0.0版本,看起来生成序列化契约的代码显式忽略了从某个基类重写的属性。 因此,运行时明确且故意不在您的示例中序列化Leaf.IsSelected
。
我怀疑它是这样做的,因为他们不想处理检查基类(或一些中间祖先类)是否也将序列化属性。 如果是这种情况,您最终可能会被序列化的属性的多个值,这可能是不可取的。
一如既往,我们不应过分依赖Reflector所展示的内容,因为代码总是可以改变,但至少我们知道它是故意这样做的。
如果其他人正在寻找,代码是ImportDataMembers
在功能上ClassDataContract.ClassDataContractCriticalHelper
。
您还需要在Composite和Component类的IsSelected属性上添加[DataMember]
属性。 试试吧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.