字段与属性和XMLSerializers(101)

时间:2011-08-19 13:56:25

标签: c# .net

所以我一直在研究在.NET Framework中使用各种序列化程序,在尝试防止类中的某些对象被序列化时,我又回到了一些非常基本的编程问题,我“想到”我知道了。给出这个例子:

public class Example
{
   public string examName;
   [XmlIgnore]
   public int exampleNumber;

   public Example()
   { }
   [XmlIgnore]
   public int ExampleNumberTwo { get; set; }
}

我可以创建此类的实例,并且使用XMLSerializer可以以XML格式输出此类的内容。 [XmlIgnore]属性实际上做了我所期望的;它会阻止引用项的序列化。

进一步冒险我用[NonSerializable]替换了“exampleNumber”的[XmlIgnore]声明,期望得到类似的结果,但输出没有改变。在搜索资源之后,声明[NonSerializable]属性应仅用于字段,[XmlIgnore]属性应用于属性。

另一篇文章指出,[NonSerializable]属性在使用XMLSerializer时无效,但在使用SOAP或BinaryFormatter时会产生预期的结果。所以我现在迷失在这个概念上。

但这让我想到了一个基本问题,一个字段与一个属性的定义是什么?我知道这是一个基本问题,我甚至在这里看过其他讨论,但我所寻求的清晰程度仍然不是很清楚。

我可以在属性(ExampleNumberTwo)或变量(exampleNumber)上使用[XmlIgnore]属性,因此它只能在Properties上使用的语句似乎不正确。

但话说回来,我总是把我的例子中的对象称为(examName)和(exampleNumber)作为成员变量。那么“Field”的签名究竟是什么?

任何人都可以对此有所了解吗?

3 个答案:

答案 0 :(得分:3)

The MSDN documentation支持[NonSerialized]仅使用二进制和SOAP序列化程序提供预期结果的想法:

  

使用BinaryFormatter或SoapFormatter类进行序列化时   对象,使用NonSerializedAttribute属性来阻止字段   从序列化。例如,您可以使用此属性   防止敏感数据的序列化。

     

NonSerializedAttribute属性的目标对象是public   和可序列化类的私有字段。默认情况下,类是   除非用SerializableAttribute标记,否则不可序列化。   在序列化过程中的所有公共和私有领域   一个类默认是序列化的。标有的字段   序列化期间排除NonSerializedAttribute。 如果你是   使用XmlSerializer类序列化对象,使用   XmlIgnoreAttribute类以获得相同的功能。或者,   实现ISerializable接口以显式控制   序列化过程。请注意,实现ISerializable的类   必须仍然标有Seri​​alizableAttribute。

就“字段”与“属性”而言,字段是类包含的直接数据变量。属性实际上是类(get_PropName()set_PropName())上特别命名的方法。在您的代码中,编译器允许您以与使用字段相同的方式使用属性,然后为您插入适当的get / set调用。

通常,属性将是围绕字段的简单包装器:

private int myField;
public int MyProperty
{
    get { return myField; }
    set { myField = value; }
}

但他们不一定是:

public int TodaysDate
{
    get { return DateTime.Today; }
}

通常,您希望所有字段都为private,因为它们应该是实现细节。您想要公开的任何简单数据都应该通过属性来完成,因为您可以使用(可更改的)逻辑轻松地围绕数据访问。

答案 1 :(得分:2)

在C#中,简短的回答是属性有get和/或set方法,而field没有。 VB.NET通过要求使用“Property”限定符来区分其中一个来使其更加明显。

使用C#,您只需将“{get; set;}”附加到字段定义的末尾,它现在就是属性。

这个真正发挥作用的地方正在反思中。字段和属性彼此隔离为不同的可枚举集合。

答案 2 :(得分:1)

ThisWhat are the differences between the XmlSerializer and BinaryFormatter的回答将帮助您开始朝着正确的方向前进。