私はおそらくJMSの訪問者メカニズムと混同しています。JMSシリアライザはカスタムオブジェクトをシリアライズしてデシリアライズします
シリアル化クラスはJSONとバックカスタムプロパティに何クラス直列化復元されるべきであるかを示すクラスを追加することとする: は、しかし、私はこれを達成したいです。
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);
}
私はシリアル化を行う際の問題は、唯一の
__class__
はdata
も、アレイの一部ではない、シリアライザです。私は同様の問題があった