@Override
  public void fromData(DataInput in,
      DeserializationContext context) throws IOException, ClassNotFoundException {
    myId = readMember(in);
    int flags = in.readInt();
    singleMember = ((flags & 0x01) == 0x01);
    localVersion.set(in.readLong());
    localGCVersion.set(in.readLong());
    int numHolders = in.readInt();
    for (int i = 0; i < numHolders; i++) {
      T key = readMember(in);
      RegionVersionHolder<T> holder = new RegionVersionHolder<>(in);
      holder.id = key;
      memberToVersion.put(key, holder);
    }
    int numGCVersions = in.readInt();
    for (int i = 0; i < numGCVersions; i++) {
      T key = readMember(in);
      RegionVersionHolder<T> holder = memberToVersion.get(key);
      if (holder != null) {
        key = holder.id;
      } // else it could go in canonicalIds, but that's not used in copies of RVVs
      long value = in.readLong();
      memberToGCVersion.put(key, value);
    }
    localExceptions = new RegionVersionHolder<>(in);
  }
after deserializing a version tag or RVV the IDs in it should be replaced with references to
IDs returned by this method. This vastly reduces the memory footprint of tags/stamps/rvvs

@return the canonical reference
geode-core/src/main/java/org/apache/geode/internal/cache/versions/RegionVersionVector.java