Pre_deserialize回调在JMSSerializer中不起作用

时间:2015-02-18 20:35:37

标签: symfony jmsserializerbundle jms-serializer

我试图通过jmsserializer在pre_deserialization上执行我的Document的__constructor,但我不知道它为什么不起作用。

我正在从yaml文件加载序列化程序元数据,如下所示:

AppBundle\Document\Campaign:
exclusion_policy: ALL
xml_root_name: campaign
properties:
    id:
        type: string
        expose: true
    slug:
        type: string
        expose: true
    name:
        type: string
        expose: true
callback_methods:
    pre_deserialize: [__construct]

当我尝试反序列化执行时:

$object = $serializer->deserialize($jsonString, 'AppBundle\\Document\\Campaign', 'json');

我无法访问构造函数,但是如果我将事件更改为任何其他可用的事件(pre_serialize,post_serialize和post_deserialize),我会这样做。

我认为缺少有关此特定事件处理的代码,但是尝试复制影响其他事件的相同代码仍然无效。 看起来它从未在事件调度程序或类似事件中注册。

我的环境是:

symfony                2.6.3
jms/serializer         0.16.0
jms/serializer-bundle  0.13.0

感谢。

1 个答案:

答案 0 :(得分:2)

我可以验证这似乎是JMS Serializer中的错误。出于某种原因,服务容器没有读取pre_deserialize事件并将其注册到JMS。

但是,您可以使用事件订阅者解决此问题。

首先定义Subscriber类,类似于您的侦听器:

<?php

namespace Acme\AcmeBundle\Listener;

use JMS\Serializer\EventDispatcher\PreDeserializeEvent;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;

class SerializationSubscriber implements EventSubscriberInterface
{

    /**
     * @inheritdoc
     */
    static public function getSubscribedEvents()
    {
        return array(
            array('event' => 'serializer.pre_deserialize', 'method' => 'onPreDeserialize'),
        );
    }

    public function onPreDeserialize(PreDeserializeEvent $event)
    {
        echo "we're about to de-cerealizing";
    }
}

然后在捆绑包的服务配置中注册订阅者:

parameters:
    acme.serializer_subscriber.class: Acme\AcmeBundle\Listener\SerializationSubscriber

services:
    acme.serializer.subscriber:
    class: %acme.serializer_subscriber.class%
    tags:
        - { name: jms_serializer.event_subscriber }

重建你的缓存,你应该很好!

官方文档:http://jmsyst.com/libs/serializer/master/event_system