gpt4 book ai didi

c# - DataContract 序列化 - 基类、继承和覆盖

转载 作者:太空狗 更新时间:2023-10-29 18:23:01 26 4
gpt4 key购买 nike

大家好

我是一名独立游戏开发者,过去主要使用 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”,“Rotation”是否会被正确序列化,“Name”是否会被序列化?

后续问题:本来想早点问的,当时想不起来了。序列化程序处理程序如何覆盖 [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; } }
}

'Complex' 中的'Value' 会被序列化吗?一些答案表明,如果不使用 [DataMember] 标签,所有属性都将被序列化。如果是,基类的 [IgnoreDataMember] 属性有什么影响吗?

最佳答案

一些答案​​中提出的一些想法不清楚。请让我清理它们。首先,使用 DataContract 的序列化程序可用于序列化未使用 DataContract 修饰的类型。您只需要将它们告知序列化程序即可。

例如,DataContractJsonSerializer 类会将一个类型序列化为一个 JSON 对象(通常是一个字符串)。您只需告诉它您正在序列化的对象类型,然后是它可能引用的任何其他类型:

var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(MyClass), new Type[] { Type1, Type2, Type3 });

序列化器将自动序列化该类型的每个公共(public)字段和属性。有关详细信息,请参阅 http://msdn.microsoft.com/en-us/ms733127

DataContractAttribute 标记类型

一旦您使用 DataContractAttribute 标记了一个类型,您就将该类型转换为一个自动已知的类型(您不需要将其作为子类型提供)并将其转换为属性和字段进入选择加入模式。

因此,您必须用DataMemberAttribute 修饰每个您想要序列化的字段或属性。这意味着 IgnoreDataMemberAttribute 没有用。是的,序列化程序不会查找它,因为任何未标记 DataMemberAttribute 的内容都会被自动忽略。

未标记的 DataContractAttribute 类型

如前所述,当序列化未应用 DataContractAttribute 的类型时,每个公共(public)属性或字段都将被序列化。因此,这里使用 IgnoreDataMemberAttribute 来防止属性或字段被序列化。

关于c# - DataContract 序列化 - 基类、继承和覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11115788/

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