将“NonSerializedAttribute”设置为“自动属性”

这不能在C#中完成。 有办法吗?

,万一我的小双关语不被理解,我的意思是:我如何将C#中的属性标记为NonSerialized? 当然,当属性包含逻辑时,很自然地无法执行它,但是自动属性是可序列化的,因此,我希望有一些方法可以阻止它们的序列化。

编辑*:自动实现的属性由您实际无法访问的匿名字段支持,属性设计为由基于reflection的机制控制。 这些字段不能被reflection机制引用(因为它们是匿名的)。 此编译器function需要对自动属性的生成进行大量更改…还需要编译器将自动属性视为字段,以便将字段属性标记到其上。

要回答问题的更基本部分 – 您的观点是自动属性是序列化的,因此应该有一种方法来控制它们的序列化。 你是对的 – 但是自动属性是一种速记,并不是为了给你充分的灵活性而设计的,而是让你在需要的时候以“长”的方式轻松扩展它们的function。

  • 我从答案的正文中添加了更多详细信息。
[NonSerialized] public string MyProperty { get; set; } 

是一个错误

  [XmlIgnore] public string MyProperty { get; set; } 

不是错误

NonSerialized指示不应序列化可序列化类的字段。

XmlIgnore指示XmlSerializer的Serialize方法不要序列化公共字段或公共读/写属性值

所以,如果你问

我希望有一些方法可以阻止他们的序列化。

答案是的,如果您正在使用XmlSerializer

对于事件,您可以使用[field:NonSerialized] ,但对于自动属性,这不起作用。 似乎处理自动属性也是一种非常合乎逻辑的方式,但由于某些原因它似乎没有实现。

我理论是的,这是可能的。 实际上,不可能。

序列化类仅适用于私有字段。 定义自动属性时; 在幕后编译器自动为它生成一个私有字段。 这意味着这是一种语言function,而不是.net框架function。

此外,序列化类也包含在redbits中 ,除了错误修复之外,这是由于兼容性而被禁止的任何更改。

我希望这会有所帮助。

上面所说的是正确的:你不能通过设置像[NonSerialized]这样的属性来阻止自动实现的属性被序列化。 它只是不起作用。

但是,如果您正在使用WCF [DataContract],那么[IgnoreDataMember]属性的作用是什么。 所以

 [DataContract] public class MyClass { [DataMember] public string ID { get; set; } [IgnoreDataMember] public string MySecret { get; set; } } 

将在WCF下进行序列化。

虽然由于WCF是一种选择加入技术,你也可以省略[IgnoreDataMember],它也可以。 所以也许我的评论有点大学;-)

您可以使用字节码操作库Mono.Cecil来完成此操作。 理论上,您可以将自定义属性添加到隐藏的后备字段。 然而,这是非常不方便的,我认为这不是一个例子。

如果您有一个拥有自己的后处理器的大型应用程序,您可以考虑创建自己的NonSerializedAttribute替代品,该替代品可以应用于属性。 然后,后处理器可以使用Mono.Cecil或类似方法将NonSerializedAttribute应用于支持字段。 大型应用程序经常进行此类后处理以节省额外的输入量是很常见的。

[NonSerialized] public decimal yourproperty;

(以小数为例。)

还要记住,如果要让类自动初始化非序列化成员,请使用IDeserializationCallback接口,然后实现IDeserializationCallback.OnDeserialization。