private void deserialize() {
      try (ByteArrayDataInput dis = new ByteArrayDataInput(myData)) {
        boolean hasCQs = dis.readBoolean();
        if (hasCQs) {
          int numEntries = InternalDataSerializer.readArrayLength(dis);
          cqs = new HashMap<>(numEntries);
          for (int i = 0; i < numEntries; i++) {
            Long key = InternalDataSerializer.readUnsignedVL(dis);
            MessageType value =
                MessageType.valueOf((int) InternalDataSerializer.readUnsignedVL(dis));
            cqs.put(key, value);
          }
        }
        interestedClients = InternalDataSerializer.readSetOfLongs(dis);
        interestedClientsInv = InternalDataSerializer.readSetOfLongs(dis);
        myData = null; // prevent future deserializations by setting this to null
      } catch (IOException e) {
        throw new InternalGemFireError(e);
      }
    }
FilterInfo fields are only deserialized if they are needed. We send all FilterInfo routings
to all members that receive a cache op message but each member is only interested in its own
routing, so there is no need to deserialize the routings for other members
geode-core/src/main/java/org/apache/geode/internal/cache/FilterRoutingInfo.java