I don't think you need to use the graph context to avoid allocation. Use a single KryoObjectOutput on ExternalizableSerializer, use setKryo and setOutput to configure it. It doesn't matter that read() and write() are reentrant because for any given object graph serialization it will be the same Kryo and Output instances.