JMS Serializer访问者继续默认反序列化

时间:2013-12-10 08:30:02

标签: jmsserializerbundle

我已为JMS序列化配置了访问者:

class MyHandler implements SubscribingHandlerInterface
{

public static function getSubscribingMethods()
{
    return array(
        array(
            'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
            'format' => 'json',
            'type' => 'MyObject',
            'method' => 'serializeContextParent',
        ),
    );
}

public function serializeContextParent(JsonSerializationVisitor $visitor, $data, array $type, Context $context)
{
    if (in_array('id', $type['params']))
        return $data->getId();

    // Do default deserialization ???
}

}

我想只在有参数id时反序列化MyObject的id(所以声明的类型是@JMS \ Type(“MyObject<'id'>”)。

这很好,但是,如果找不到参数,我想继续默认的反序列化。

这可能吗?

由于

1 个答案:

答案 0 :(得分:0)

在特殊情况下,只需使用不同的对象类型:

class MyObject {
    /**
     * @var User
     * @JMS\Type("User")
     * /
    protected $user;
    /**
     * @var User
     * @JMS\Type("UserWithId")
     * /
    protected $userWithId;
}

处理程序可以是:

class MyHandler implements SubscribingHandlerInterface
{

public static function getSubscribingMethods()
{
    return array(
        array(
            'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
            'format' => 'json',
            'type' => 'UserWithId',
            'method' => 'serializeContextParent',
        ),
    );
}

public function serializeContextParent(JsonSerializationVisitor $visitor, $data, array $type, Context $context)
{
    return $data->getId();
}

}

由于您知道用户是否具有id(您使用的是类型参数),因此您只能使用自定义类型名称。

...并且由于可以在自定义类型上添加自定义处理程序,因此解决方案应该可以正常工作