我有一个抽象的父类(映射超类),它有几个具有不同属性的孩子,我想要反序列化。 我使用MongoDB和Doctrine ODM存储数据,所以我也有一个辨别器字段,告诉教义使用哪个子类(并且还有一个自定义的“type”属性ontop,用于确定哪个类当前正在处理) 。JMS序列化器用抽象父类反序列化
当我的模型反序列化时,我得到一个异常告诉我,它不可能创建一个抽象类(ofcourse) - 现在我想知道如何告诉JMS Deserializer它应该继承它应该使用的类就是为什么我使用自定义的type
实例变量 - 因为我无法访问doctrine的鉴别器字段映射)。
我可以成功挂钩到preDeserializeEvent
- 所以也许有可能在那里做一些开关/案例(或使用)?
我在短(抽象类)型号:
<?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..
}
?>
一个子类
<?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..
?>
另一项测试是不使模块抽象类,并创建一个自定义静态方法
/**
*
* @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??
}
有什么想法?
您应该复制你的“更新”为anwser并标记这个问题 - 这样,其他谁可能有同样的问题将清楚地看到有一个工作解决方案在此页 – loostro
好点。完成。 – con