public void fromData(DataInput in, boolean largeModCount, boolean readShadowKey)
          throws IOException, ClassNotFoundException {
        key = DataSerializer.readObject(in);
        op = Operation.fromOrdinal(in.readByte());
        if (largeModCount) {
          modSerialNum = in.readInt();
        } else {
          modSerialNum = in.readByte();
        }
        callbackArg = DataSerializer.readObject(in);
        filterRoutingInfo = DataSerializer.readObject(in);
        versionTag = DataSerializer.readObject(in);
        if (readShadowKey) {
          tailKey = in.readLong();
        }
        eventOffset = in.readInt();
        if (!op.isDestroy()) {
          didDestroy = in.readBoolean();
          if (!op.isInvalidate()) {
            boolean isTokenOrByteArray = in.readBoolean();
            if (isTokenOrByteArray) {
              // token or byte[]
              value = DataSerializer.readObject(in);
            } else {
              // CachedDeserializable, Object, or PDX
              value = CachedDeserializableFactory.create(DataSerializer.readByteArray(in),
                  GemFireCacheImpl.getInstance());
            }
          }
        }
      }
Creates and returns a new instance of a tx entry op on the far side. The "toData" that this
should match is {@link TXEntryState#toFarSideData}.

@param in the data input that is used to read the data for this entry op
@param largeModCount true if the mod count is a int instead of a byte.
@param readShadowKey true if a long shadowKey should be read
geode-core/src/main/java/org/apache/geode/internal/cache/TXCommitMessage.java