code: public static <T extends Command> void setupJacksonAnnotatedCommandSerializationAndDeserialization(ObjectMapper mapper, Class<T> commandSubclassKlass) {
          SimpleModule module = new SimpleModule("raftrpc-jackson-command-module", new Version(0, 0, 0, "inline", "io.libraft", "raftrpc-jackson-command-module"));
  
          module.addAbstractTypeMapping(Command.class, commandSubclassKlass);
          module.addDeserializer(commandSubclassKlass, new RaftRPCCommand.PassThroughDeserializer<T>(commandSubclassKlass));
  
          mapper.registerModule(module);
      }
docs: Setup serialization and deserialization for Jackson-annotated {@link Command} subclasses.
  All Jackson-annotated {@code Command} subclasses <strong>must</strong> derive from a single base class.
  <p/>
  The following <strong>is</strong> supported:
  <pre>
  Object
  +-- CMD_BASE
  +-- CMD_0
  +-- CMD_1
  </pre>
  And the following is <strong>not</strong> supported:
  <pre>
  Object
  +-- CMD_0
  +-- CMD_1
  </pre>
  See {@code RaftAgent} for more on which {@code Command} types are supported.
  
  @param mapper instance of {@code ObjectMapper} with which the serialization/deserialization mapping is registered
  @param commandSubclassKlass the base class of all the Jackson-annotated {@code Command} classes
  
  @see io.libraft.agent.RaftAgent