0

我试图通过 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

谢谢。

4

1 回答 1

2

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

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

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

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

于 2015-04-03T22:47:03.290 回答