我已为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'>”)。
这很好,但是,如果找不到参数,我想继续默认的反序列化。
这可能吗?
由于
答案 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(您使用的是类型参数),因此您只能使用自定义类型名称。
...并且由于可以在自定义类型上添加自定义处理程序,因此解决方案应该可以正常工作