@Override
  public void toData(DataOutput out,
      SerializationContext context) throws IOException {
    if (isLiveVector) {
      throw new IllegalStateException("serialization of this object is not allowed");
    }
    writeMember(myId, out);
    int flags = 0;
    if (singleMember) {
      flags |= 0x01;
    }
    out.writeInt(flags);
    out.writeLong(localVersion.get());
    out.writeLong(localGCVersion.get());
    out.writeInt(memberToVersion.size());
    for (Map.Entry<T, RegionVersionHolder<T>> entry : memberToVersion.entrySet()) {
      writeMember(entry.getKey(), out);
      InternalDataSerializer.invokeToData(entry.getValue(), out);
    }
    out.writeInt(memberToGCVersion.size());
    for (Map.Entry<T, Long> entry : memberToGCVersion.entrySet()) {
      writeMember(entry.getKey(), out);
      out.writeLong(entry.getValue());
    }
    InternalDataSerializer.invokeToData(localExceptions, out);
  }
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