【问题标题】:C# DataContract Attribute for Private Fields?私有字段的 C# DataContract 属性?
【发布时间】:2012-02-11 14:34:04
【问题描述】:

对于一个用属性[DataContract]标记的类,它的应该被序列化的私有字段是否被标记为[DataMember]?

例子:

[DataContract]
public class Component
{

// [DataMember] is not needed since public fields get automatically serialized
public int number;

// do I need [DataMember] here?
private string characters;

// [DataMember] is required here, but I also need to include the 
// attribute [DataMember] in this class's definition
private complexType cT;

我正在正确阅读DataContractAttribute Class,对吗?

【问题讨论】:

    标签: c# datacontract


    【解决方案1】:

    不,您似乎没有正确阅读文档。

    DataContracts 是一种公开共享信息的方式,与常规序列化略有不同。

    从您链接的文档页面:

    然后必须将 DataMemberAttribute 属性应用于数据协定类型的每个成员,以表明它是一个数据成员,也就是说,它应该被序列化。

    但这仅适用于您添加 [DataContract] 属性的情况。

    【讨论】:

    • 那么,如果我的类被标记为 [DataContract] 属性,那么如果我希望每个属性或字段可序列化,我需要用 [DataMember] 属性标记它吗?如果一个Property或Field没有被标记为[DataMember],那么它不会被序列化?
    • 如果我的类的属性被标记为 [DataMember],而不是属性设置和获取的实际字段怎么办?
    • @Kevin 那会很好用。它将使用属性的 getter 和 setter 来序列化和反序列化数据。
    【解决方案2】:

    链接说的很有趣:

    默认情况下,DataContractSerializer 推断数据协定并序列化所有公开可见的类型。该类型的所有公共读/写属性和字段都已序列化。

    在我的应用程序中,我发现只有包含[DataMember] 的属性会被序列化。除非我特别在它们上面加上 [Datamember],否则带有公共 getter/setter 的公共属性不会被序列化。


    为了解决您的具体问题,我会用[DataMember] 标记所有3 个字段,并且complexType 类也应该标记为[DataContract]

    【讨论】:

    • @rally25rs 那是因为您可能正在添加 [DataContract] 属性。如果将属性添加到类,则成员也必须具有属性。但是,如果您不添加数据协定属性,则文档中的该行适用。文档说明了这一点,但它有点神秘。
    • @McKay:啊,我明白了。是的,我绝对没有从那个文件中得到那个微妙的观点。感谢您的信息。
    • 碰到我的可序列化问题。
    猜你喜欢
    • 2010-09-29
    • 2013-07-09
    • 2011-10-06
    • 2011-06-17
    • 2013-12-27
    • 2014-10-23
    • 2010-12-14
    • 2017-12-09
    相关资源
    最近更新 更多