@Override
  public ExtensionCriterion read(Kryo kryo, Input input, Class<ExtensionCriterion> type) {
    ExtensionSelectorType exType = (ExtensionSelectorType) kryo.readClassAndObject(input);
    DeviceId deviceId = (DeviceId) kryo.readClassAndObject(input);
    DriverService driverService = DefaultServiceDirectory.getService(DriverService.class);
    byte[] bytes = (byte[]) kryo.readClassAndObject(input);
    ExtensionSelector selector;

    try {
      DriverHandler handler =
          new DefaultDriverHandler(
              new DefaultDriverData(driverService.getDriver(deviceId), deviceId));
      ExtensionSelectorResolver resolver = handler.behaviour(ExtensionSelectorResolver.class);
      selector = resolver.getExtensionSelector(exType);
      selector.deserialize(bytes);
    } catch (ItemNotFoundException | IllegalArgumentException e) {
      selector = new UnresolvedExtensionSelector(bytes, exType);
    }

    return Criteria.extension(selector, deviceId);
  }