【发布时间】:2012-06-22 08:48:47
【问题描述】:
大家好,
我是一名独立游戏开发人员,过去主要与 XNA 合作,而在另一个极端,我主要与商业工具集合作。然而,XNA 的范围非常有限,我正在构建一个跨平台抽象层来针对多个平台。
长话短说,我需要比 [Serializable] 更广泛地访问的 xml 序列化,并且有人指出我需要数据契约。我一直在做很多研究,但找不到任何关于系统基础知识的好信息,与继承和覆盖有关。
我的问题的症结是……
[DataContract]
public class Node
{
private string name;
public string Name { get { return name; } set { name = value; } }
public virtual float Rotation { get { return 0f; } set { } }
}
[DataContract]
public class FancyNode : Node
{
private float rotation;
public override float Rotation { get { return rotation; } set { rotation = value; } }
}
如果我序列化一个“FancyNode”,是否会正确序列化“旋转”,是否会序列化“名称”?
后续问题: 本来想早点问的,当时想不起来了。序列化程序处理程序如何覆盖 [IgnoreDataMember] 属性?比如……
[DataContract]
public class Simple
{
[IgnoreDataMember]
public virtual string Value { get { return ""; } set { } }
}
[DataContract]
public class Complex : Simple
{
private string value;
public override string Value { get { return value; } set { this.value = value; } }
}
“复杂”中的“值”会被序列化吗?一些答案表明,如果不使用 [DataMember] 标记,则所有属性都将被序列化。如果有,基类的[IgnoreDataMember]属性有什么关系吗?
【问题讨论】:
-
你还需要为 typeof(Node) 使用 KnowType 的 FancyNode,因为它是 XML(基于数据的)...
-
如果你不添加 DataMember,所有的 props 都将被视为 DataMember(在 .NET 4 中(我猜)),但如果你做了一些没有的将不会被序列化。
-
@L.B 我很乐意尝试,但我认为我可能会从其他人的经验中受益。很快我将需要自己探索实现,但如果我能做好准备,可能会减少很多挫折。
-
@Jocke 那么你必须对一个类的所有“基类”使用 KnowType 吗?我的印象是您只需要在数据成员可能包含反序列化继承类实例的情况下使用它?
-
取决于你想如何使用类关系,见msdn.microsoft.com/en-us/library/ms730167.aspx
标签: c# inheritance serialization overriding datacontract