JMS Serializer Deserialize con clase padre abstracta

Tengo una clase abstracta de padres (super mapeada) que tiene varios hijos con diferentes propiedades que me gustaría deserializar. Estoy almacenando los datos utilizando MongoDB y Doctrine ODM, así que también tengo un campo discriminador que le dice a la doctrina qué subclase se usa (y también tengo una propiedad personalizada de "tipo" que se usa en otro lugar para determinar qué clase se procesa actualmente).

Al deserializar mi modelo, recibo una excepción que me dice que es imposible crear una instancia de una clase abstracta (por supuesto). Ahora me pregunto cómo puedo decirle al Deserializador JMS qué clase heredada debería usar (por eso uso Una costumbretype variable de instancia, por ejemplo, porque no tengo acceso a la asignación de campos discriminadores de doctrina).

Puedo enganchar con éxito en elpreDeserializeEvent- ¿Entonces tal vez es posible hacer algunos cambios / casos allí (o usando el)?

Mi modelo en resumen (clase abstracta):

<?php 

namespace VBCMS\Bundle\AdminBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use JMS\Serializer\Annotation as Serializer;

/**
 * abstract Class Module
 * @Serializer\AccessType("public_method")
 * @MongoDB\MappedSuperclass
 * @MongoDB\InheritanceType("SINGLE_COLLECTION")
 * @MongoDB\DiscriminatorField(fieldName="_discriminator_field")
 * @MongoDB\DiscriminatorMap({
 *    "module"="Module",
 *    "text_module"="TextModule",
 *    "menu_module"="MenuModule",
 *    "image_module"="ImageModule"
 * })
 */
abstract class Module {

  const TYPE_MODULE_TEXT        = 'module.text';
  const TYPE_MODULE_MENU        = 'module.menu';
  const TYPE_MODULE_MEDIA_ITEM  = 'module.media.item';

  /**
   * @Serializer\Type("string")
   * @MongoDB\Field(type="string")
   * @var String
   */
  protected $type;

  /**
   * @Serializer\Type("boolean")
   * @MongoDB\Field(type="boolean")
   * @var boolean
   */
  protected $visible;

  // getter/setter methods etc..
}

?>

Una de las subclases

<?php
namespace VBCMS\Bundle\AdminBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use JMS\Serializer\Annotation as Serializer;

/**
 * Class TextModule
 * @package VBCMS\Bundle\AdminBundle\Document
 * @Serializer\AccessType("public_method")
 * @MongoDB\EmbeddedDocument
 */
class TextModule extends Module {

    const TEXT_TYPE_SPLASH_HEADLINE = 'splashscreen.headline';
    const TEXT_TYPE_SPLASH_SUBLINE  = 'splashscreen.subline';

    /**
     * the actual text
     *
     * @var string
     * @Serializer\Type("string")
     * @MongoDB\Field(type="string")
     */
    protected $text;

    /**
     * how it is called in the admin interface
     *
     * @var string
     * @Serializer\Type("string")
     * @MongoDB\Field(type="string")
     */
    protected $label;

    /**
     * @var string
     * @Serializer\Type("string")
     * @MongoDB\Field(type="string")
     */
    protected $textType;

    // getter/setter methods etc..
?>

Otra prueba fueno hacer El módulo de clase abstracto y para crear un método estático personalizado.

/**
 *
 * @Serializer\HandlerCallback("json", direction="deserialization")
 * @param JsonDeserializationVisitor $visitor
 */
public static function deserializeToObject(JsonDeserializationVisitor $visitor)
{
  // modify visitor somehow to return an instance of the desired inherited module class??
}

¿algunas ideas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta