public T getCanonicalId(T id) {
    if (id == null) {
      return null;
    } else if (id.equals(myId)) {
      return myId;
    } else {
      T can = id;
      T cId = canonicalIds.get(can);
      if (cId != null) {
        return cId;
      }
      if (!id.isDiskStoreId()) {
        InternalDistributedSystem system = InternalDistributedSystem.getConnectedInstance();
        if (system != null) {
          can = (T) system.getDistributionManager().getCanonicalId((InternalDistributedMember) id);
        }
      }
      synchronized (canonicalIdLock) {
        HashMap<T, T> tmp = new HashMap<>(canonicalIds);
        tmp.put(can, can);
        canonicalIds = tmp;
      }
      return can;
    }
  }
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