TL;DR
我的自定义[Serializable]
类覆盖GetHashCode
和Equals
,因此多个不同的对象可以是";等于";,并且看起来BinaryFormatter
只调用OnSerialized
一次,而当图中存在两个相等但不同的(ReferenceEquals
==false
(对象时调用OnDeserialized
两次。
如果我想保留我的GetHashCode
和Equals
实现,我可以做些什么来确保每次调用[OnSerialized]
方法[OnDeserialized]
方法都只调用一次?
理想情况下,我希望指示BinaryFormatter
为我的自定义类使用IEqualityComparer
的自定义实现,这样它就不会试图";合并";不同但平等的实例。
背景
该类包装了一个refcounted非托管句柄,该句柄使用BinaryFormatter
在应用程序域之间传递。为了使refcount与活动的.NET实例保持同步,我在[OnSerialized]
处理程序中将其增加1,假设对象将被反序列化一次,这在上面的场景中是违反的(反序列化后将丢弃序列化的位(。
实现ISerializable
而不是使用[OnSerialized]
属性是有效的:即使Equals
和GetHashCode
相等,也会为每个不同的对象调用GetObjectData
。
缺点是:
- 可能比较慢
- 现在,从包装器派生的所有类型都必须具有签名为
.ctor(SerializationInfo info, StreamingContext context)
的反序列化构造函数