Pre_deserialize 回调在 JMSSerializer 中不起作用

Pre_deserialize callback not working in JMSSerializer

我正在尝试通过 jmsserializer 在 pre_deserialization 上执行文档的 __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

谢谢。

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

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

首先定义订阅者class,类似于你的监听器:

<?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