gpt4 book ai didi

c# - 使用 DataContractSerializer 序列化覆盖的属性

转载 作者:行者123 更新时间:2023-11-30 17:58:08 28 4
gpt4 key购买 nike

我在基础中有一个抽象属性,它被 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;
}
}
}

我认为将 [DataMember] 属性放在 Leaf 的“IsSelected”属性上就足够了,但显然,甚至连 Leaf 的属性都没有被序列化。

谢谢!

最佳答案

我在 Reflector 中深入研究了这个问题,查看了 System.Runtime.Serialization 的 4.0.0.0 版本,似乎生成序列化契约的代码明确忽略了一些属性基类。因此,在您的示例中,运行时明确且故意不序列化 Leaf.IsSelected

我怀疑这样做是因为他们不想检查基类(或某些中间祖先类)是否也将序列化该属性。如果是这种情况,您最终可能会得到被序列化的属性的多个值,这可能是不可取的。

一如既往,我们不应该过分依赖 Reflector 显示的内容,因为代码总是可以更改,但至少我们知道它是故意这样做的。

如果其他人在看,代码是 ClassDataContract.ClassDataContractCriticalHelper 中的 ImportDataMembers 函数。

关于c# - 使用 DataContractSerializer 序列化覆盖的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607227/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com