private void doCreateOtherVm(final VM otherVM) {
    otherVM.invoke(new CacheSerializableRunnable("create root") {

      @Override
      public void run2() throws CacheException {
        getSystem();

        CacheListener listener = new CacheListenerAdapter() {
          @Override
          public void afterCreate(final EntryEvent event) {
            if (event.getCallbackArgument() != null) {
              lastCallback = event.getCallbackArgument();
            }
          }

          @Override
          public void afterUpdate(final EntryEvent event) {
            if (event.getCallbackArgument() != null) {
              lastCallback = event.getCallbackArgument();
            }
          }

          @Override
          public void afterInvalidate(final EntryEvent event) {
            if (event.getCallbackArgument() != null) {
              lastCallback = event.getCallbackArgument();
            }
          }

          @Override
          public void afterDestroy(final EntryEvent event) {
            if (event.getCallbackArgument() != null) {
              lastCallback = event.getCallbackArgument();
            }
          }
        };

        AttributesFactory factory = new AttributesFactory();
        factory.setCacheListener(listener);

        // create a pr with a data store
        PartitionAttributesFactory partitionAttributesFactory = new PartitionAttributesFactory();
        partitionAttributesFactory.setRedundantCopies(0);

        // use defaults so this is a data store
        factory.setPartitionAttributes(partitionAttributesFactory.create());
        createRootRegion(REGION_NAME, factory.create());
      }
    });
  }
Make sure that value is only deserialized in cache whose application asks for the value.
geode-core/src/distributedTest/java/org/apache/geode/cache30/RemotePRValuesAreNotDeserializedRegressionTest.java