[英]Private const defined on class level and then used on an attribute, why this compile?
[英]Why can't the 'NonSerialized' attribute be used at the class level? How to prevent serialization of a class?
我有一个使用二进制序列化进行深度克隆的数据对象。 此数据对象支持属性更改事件,例如PriceChanged。
假设我将处理程序附加到PriceChanged。 当代码尝试序列化PriceChanged时,它会抛出一个异常,即处理程序未标记为可序列化。
我的选择:
-
我终于通过使处理程序实现ISerializable并在serialize构造函数/ GetDataObject方法中不执行任何操作来解决此问题。 但是,处理程序仍然是序列化的,只是将其所有依赖项设置为null - 所以我也必须考虑到这一点。
有没有更好的方法来阻止整个类的序列化? 也就是说,不需要考虑空依赖关系?
虽然我倾向于不同意这种方法(我只是将事件标记为NonSerialized,无论有多少)你可以使用序列化代理来做到这一点。
我们的想法是,您创建一个实现ISerializationSurrogate的对象,并基本上执行您正在执行的操作 - GetObjectData和SetObjectData方法中没有任何内容。 不同之处在于您将自定义委托的序列化,而不是包含它的类。
就像是:
class DelegateSerializationSurrogate : ISerializationSurrogate {
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) {
// do nothing
}
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context) {
// do nothing
return null;
}
}
然后使用本MSDN专栏中列出的步骤将其注册到格式化程序。 然后,只要格式化程序遇到委托,它就会使用代理而不是直接对委托进行序列化。
......有几十个事件......
就个人而言,我只是添加非序列化标记,通过以下方式最容易完成类似字段事件:
[field: NonSerialized]
public event SomeEventType SomeEventName;
(您不需要添加手动支持委托)
您的序列化要求到底是什么? BinaryFormatter
在许多方面是最不友好的序列化器; 对事件的影响有点难看,如果存储它会非常脆弱(IMO它只适合运输而不是存储)。
然而; 有很多很好的选择可以支持最常见的“深度克隆”场景:
XmlSerializer
(但仅限于公共成员) DataContractSerializer
/ NetDataContractSerializer
Serializer.DeepClone
) (请注意,在大多数序列化支持中,需要额外的属性,因此首先添加[NonSerialized]
属性并没有多大区别!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.