@Override
    @SuppressWarnings("unchecked")
    public ValueExtractor getExtractor(JavaTypeDescriptor javaTypeDescriptor) {
      if (Serializable.class.isAssignableFrom(javaTypeDescriptor.getJavaTypeClass())) {
        return VarbinaryTypeDescriptor.INSTANCE.getExtractor(javaTypeDescriptor);
      }

      return new BasicExtractor(javaTypeDescriptor, this) {
        @Override
        protected Object doExtract(ResultSet rs, String name, WrapperOptions options)
            throws SQLException {
          return rs.getObject(name);
        }

        @Override
        protected Object doExtract(CallableStatement statement, int index, WrapperOptions options)
            throws SQLException {
          return statement.getObject(index);
        }

        @Override
        protected Object doExtract(CallableStatement statement, String name, WrapperOptions options)
            throws SQLException {
          return statement.getObject(name);
        }
      };
    }
    @Override
    public <X> ValueBinder<X> getBinder(JavaTypeDescriptor<X> javaTypeDescriptor) {
      if (Serializable.class.isAssignableFrom(javaTypeDescriptor.getJavaTypeClass())) {
        return VarbinaryTypeDescriptor.INSTANCE.getBinder(javaTypeDescriptor);
      }

      return new BasicBinder<X>(javaTypeDescriptor, this) {
        @Override
        protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
            throws SQLException {
          st.setObject(index, value, jdbcTypeCode);
        }
      };
    }