所以我一直在研究在.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”的签名究竟是什么?
任何人都可以对此有所了解吗?
答案 0 :(得分:3)
The MSDN documentation支持[NonSerialized]
仅使用二进制和SOAP序列化程序提供预期结果的想法:
使用BinaryFormatter或SoapFormatter类进行序列化时 对象,使用NonSerializedAttribute属性来阻止字段 从序列化。例如,您可以使用此属性 防止敏感数据的序列化。
NonSerializedAttribute属性的目标对象是public 和可序列化类的私有字段。默认情况下,类是 除非用SerializableAttribute标记,否则不可序列化。 在序列化过程中的所有公共和私有领域 一个类默认是序列化的。标有的字段 序列化期间排除NonSerializedAttribute。 如果你是 使用XmlSerializer类序列化对象,使用 XmlIgnoreAttribute类以获得相同的功能。或者, 实现ISerializable接口以显式控制 序列化过程。请注意,实现ISerializable的类 必须仍然标有SerializableAttribute。
就“字段”与“属性”而言,字段是类包含的直接数据变量。属性实际上是类(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)
This对What are the differences between the XmlSerializer and BinaryFormatter
的回答将帮助您开始朝着正确的方向前进。