Сериализатор JMS сериализует пользовательский объект и десериализует

Я, скорее всего, запутался с механизмом посетителей в JMS. Но я хочу добиться этого:

сериализовать класс в json и обратно с добавлением пользовательского свойства class, которое указывает, для какого класса должна быть выполнена десериализация.

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);
    }
  1. Проблема в том, что когда я сериализую, только __class__ является сериализатором, data даже не является частью массива.

  2. Я должен быть в состоянии десериализовать {"__class__":"MyBundle\\MyDTO","data":{"prop1":["x","xx"],"prop2":"x"}}


person zajca    schedule 22.06.2017    source источник


Ответы (1)


У меня была аналогичная проблема. Часть моего объекта была проигнорирована сериализатором JMS, когда я это делаю:

$serializer->deserialize($data, MyClass::class, 'json')

Я понимаю, что проблема заключается в геттерах и сеттерах моих свойств объекта camelCase.

Я исправил свою проблему с кодированием данных JSON с помощью JMS Serializer (первоначально с образцом json_encode), он преобразовал весь camelCase в змеиный_case. Не знаю, поможет ли вам эта информация.

В любом случае, если у вас возникла та же проблема, эта ссылка может вам помочь: https://jmsyst.com/libs/serializer/master/reference/annotations. Вы можете определить свой собственный геттер и сеттер в аннотации @Accessor.

person TekPike    schedule 05.03.2018