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 }
重建你的缓存,你应该是好的!
我正在尝试通过 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 }
重建你的缓存,你应该是好的!