如何防止二进制格式化程序对自动实现的属性进行序列化? [NonSerialized]属性只能与字段一起使用。使用自动实现的属性时,该字段将被隐藏。
答案 0 :(得分:59)
自动实现的属性不支持。您必须使用支持字段并在其上设置NonSerializedAttribute。
public class ClassWithNonSerializedProperty {
[NonSerialized]
private object _data; // Backing field of Property Data that is not serialized
public object Data{
get { return _data; }
set { _data = value; }
}
}
答案 1 :(得分:8)
// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;
但它似乎不适用于自动实现的属性。我认为值得一提,因为知道何时序列化附加了事件订阅者的对象是有用的。
答案 2 :(得分:6)
如果您正在序列化Json并使用Json.NET serializer(我强烈推荐它,因为它提供了比市场上的许多其他序列化器更多的东西),那么您可以实现您期望的结果使用[JsonIgnore]
的属性。
您无需创建字段。
所以你的代码是:
public class ClassName
{
[JsonIgnore]
public object IgnoreMe { get; set; }
public object DoNotIgnoreMe { get; set; }
}
答案 3 :(得分:4)
如果要序列化为Xml,则可以使用XmlIgnore属性。
答案 4 :(得分:4)
我不确定你能不能。这个MSDN article on SerializableAttribute
建议你实现ISerializable并自己控制序列化:
默认情况下,序列化由SerializableAttribute标记的类型中的所有公共和私有字段,除非该类型实现ISerializable接口以覆盖序列化过程。
或切换远离该特定字段的自动属性。
答案 5 :(得分:4)
自动实现的属性不可能。 考虑一下:
此行为是“按设计”。当时实现自动属性的决定是它们将在“常见情况”中工作,其中除了其他因素之外意味着在生成的字段上没有属性。这背后的想法是保持简单,而不是慢慢地将它们变成完整的属性。 因此,如果您需要使用NonSerialized属性,则可以使用完整属性。
答案 6 :(得分:3)
使用非序列化后备字段的建议解决方案似乎无法在.NET 4.0中正常运行(至少在Xml序列化的情况下)。该字段确实没有被序列化,但使用它的公共属性确实序列化,从而违背了目的。使用XmlIgnore解决方法有助于Xml序列化。免责声明 - 我没有验证二进制序列化行为。