@Override
  public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov)
      throws Exception {
    Object value = get(bean);
    if (value == null) {
      // Hmmh. I assume we MUST pretty much suppress nulls, since we
      // can't really unwrap them...
      return;
    }
    JsonSerializer<Object> ser = _serializer;
    if (ser == null) {
      Class<?> cls = value.getClass();
      PropertySerializerMap map = _dynamicSerializers;
      ser = map.serializerFor(cls);
      if (ser == null) {
        ser = _findAndAddDynamic(map, cls, prov);
      }
    }
    if (_suppressableValue != null) {
      if (MARKER_FOR_EMPTY == _suppressableValue) {
        if (ser.isEmpty(value)) {
          return;
        }
      } else if (_suppressableValue.equals(value)) {
        return;
      }
    }
    // For non-nulls, first: simple check for direct cycles
    if (value == bean) {
      if (_handleSelfReference(bean, jgen, prov, ser)) {
        return;
      }
    }

    // note: must verify we are using unwrapping serializer; if not, will write field name
    if (!ser.isUnwrappingSerializer()) {
      jgen.writeFieldName(_name);
    }

    if (_typeSerializer == null) {
      ser.serialize(value, jgen, prov);
    } else {
      ser.serializeWithType(value, jgen, prov, _typeSerializer);
    }
  }
  // need to override as we must get unwrapping instance...
  @Override
  protected JsonSerializer<Object> _findAndAddDynamic(
      PropertySerializerMap map, Class<?> type, SerializerProvider provider)
      throws JsonMappingException {
    JsonSerializer<Object> serializer;
    if (_nonTrivialBaseType != null) {
      JavaType subtype = provider.constructSpecializedType(_nonTrivialBaseType, type);
      serializer = provider.findValueSerializer(subtype, this);
    } else {
      serializer = provider.findValueSerializer(type, this);
    }
    NameTransformer t = _nameTransformer;
    if (serializer.isUnwrappingSerializer()) {
      t =
          NameTransformer.chainedTransformer(
              t, ((UnwrappingBeanSerializer) serializer)._nameTransformer);
    }
    serializer = serializer.unwrappingSerializer(t);

    _dynamicSerializers = _dynamicSerializers.newWith(type, serializer);
    return serializer;
  }