自定义"BinaryFormatter"的相等比较器



TL;DR

我的自定义[Serializable]类覆盖GetHashCodeEquals,因此多个不同的对象可以是";等于";,并且看起来BinaryFormatter只调用OnSerialized一次,而当图中存在两个相等但不同的(ReferenceEquals==false(对象时调用OnDeserialized两次。

如果我想保留我的GetHashCodeEquals实现,我可以做些什么来确保每次调用[OnSerialized]方法[OnDeserialized]方法都只调用一次?

理想情况下,我希望指示BinaryFormatter为我的自定义类使用IEqualityComparer的自定义实现,这样它就不会试图";合并";不同但平等的实例。

背景

该类包装了一个refcounted非托管句柄,该句柄使用BinaryFormatter在应用程序域之间传递。为了使refcount与活动的.NET实例保持同步,我在[OnSerialized]处理程序中将其增加1,假设对象将被反序列化一次,这在上面的场景中是违反的(反序列化后将丢弃序列化的位(。

实现ISerializable而不是使用[OnSerialized]属性是有效的:即使EqualsGetHashCode相等,也会为每个不同的对象调用GetObjectData

缺点是:

  1. 可能比较慢
  2. 现在,从包装器派生的所有类型都必须具有签名为.ctor(SerializationInfo info, StreamingContext context)的反序列化构造函数

最新更新