代码之家  ›  专栏  ›  技术社区  ›  LOST

BinaryFormatter的自定义相等比较器`

  •  0
  • LOST  · 技术社区  · 4 年前

    TL;博士

    我的习惯 [Serializable] 类重写 GetHashCode 和 Equals ,所以多个不同的对象可以是“相等的”,看起来 BinaryFormatter 电话 OnSerialized 只有一次,但是打电话 OnDeserialized 两次当两个相等但不同时( ReferenceEquals == false )图形中存在对象。

    我能做些什么来确保每次打电话给 [OnSerialized] 方法 [OnDeserialized] 方法只调用一次,前提是我想保留 方法 和 等于 实现?

    理想情况下,我想指导 二进制格式 使用我的自定义实现 IEqualityComparer 对于我的自定义类,这样它就不会试图“合并”不同但相等的实例。

    出身背景

    该类包装了一个refcounted非托管句柄,该句柄使用 二进制格式 [串行化] 处理程序,假设对象将被反序列化一次,这在上面的场景中是违反的(反序列化后将丢弃序列化位)。

    0 回复  |  直到 4 年前
        1
  •  0
  •   LOST    4 年前

    实施 ISerializable 而不是使用 [OnSerialized] 属性工作: GetObjectData 为每个不同的对象调用,即使它们按 Equals + GetHashCode .

    缺点是:

    1. 速度可能会慢一些
    2. 现在,从包装器派生的所有类型都必须有一个带有签名的反序列化构造函数 .ctor(SerializationInfo info, StreamingContext context)
    推荐文章