Symfony JMS序列化程序序列化自定义对象并反序列化
我很可能对JMS中的访问者机制感到困惑。 但我想做到这一点: 将类序列化为json并通过添加自定义属性class返回,该属性指示应进行的类反序列化Symfony JMS序列化程序序列化自定义对象并反序列化,symfony,jmsserializerbundle,jms-serializer,Symfony,Jmsserializerbundle,Jms Serializer,我很可能对JMS中的访问者机制感到困惑。 但我想做到这一点: 将类序列化为json并通过添加自定义属性class返回,该属性指示应进行的类反序列化 public static function getSubscribingMethods() { return [ [ 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, '
public static function getSubscribingMethods()
{
return [
[
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'format' => 'json',
'type' => MyDTO::class,
'method' => 'serializeMetadataDTO',
],
[
'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,
'format' => 'json',
'type' => MyDTO::class,
'method' => 'serializeMetadataDTO',
]
];
}
public function serializeMetadataDTO(
JsonSerializationVisitor $visitor,
MyDTO $dto,
array $type,
SerializationContext $context
)
{
$visitor->visitArray([
'__class__' => get_class($dto),
'data' => $dto,
], $type, $context);
}
public function deserializeMetadataDTO(
JsonDeserializationVisitor $visitor,
?array $data,
array $type,
SerializationContext $context
)
{
if (null === $data) {
return null;
}
$typeParser = new TypeParser();
$dtoInstance = new $data['__class__'];
$metadata = $context->getMetadataFactory()->getMetadataForClass($data['__class__']);
$visitor->startVisitingObject($metadata, $dtoInstance, $typeParser->parse($data['__class__']), $context);
foreach ($data['data'] as $key => $value) {
$visitor->visitProperty($metadata->propertyMetadata[$key], $value, $context);
}
return $visitor->endVisitingObject($metadata, $dtoInstance, $type, $context);
}
\uuu class\uuu
是序列化程序,数据甚至不是数组的一部分
{“\uuuu class\uuuuu”:“MyBundle\\MyDTO”,“data”:{“prop1”:[“x”,“xx”],“prop2”:“x”}
我也有类似的问题。在执行以下操作时,JMS序列化程序忽略了部分对象:
$serializer->deserialize($data, MyClass::class, 'json')
我知道问题在于camelCase对象属性的getter和setter
我修复了使用JMS序列化程序(最初使用示例JSON\u encode
)对JSON数据进行编码的问题,它将所有camelCase转换为snake\u。我不知道这些信息是否对你有帮助
无论如何,如果您有相同的问题,此链接可以帮助您:。
您可以在@Accessor注释中定义自己的getter和setter