【问题标题】:JMS serializer serialize custom object and deserializeJMS 序列化器序列化自定义对象并反序列化
【发布时间】:2017-06-22 07:32:15
【问题描述】:

我很可能对 JMS 中的访问者机制感到困惑。 但我想做到这一点:

通过添加自定义属性 class 将类序列化为 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);
    }
  1. 问题是当我进行序列化时,只有__class__ 是序列化器,data 甚至不是数组的一部分。

  2. 我应该能够反序列化{"__class__":"MyBundle\\MyDTO","data":{"prop1":["x","xx"],"prop2":"x"}}

【问题讨论】:

    标签: symfony jmsserializerbundle jms-serializer


    【解决方案1】:

    我遇到了类似的问题。当我这样做时,JMS Serializer 忽略了我的部分对象:

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

    我知道问题在于我的 camelCase 对象属性的 getter 和 setter。

    我解决了使用 JMS 序列化器(最初使用示例 json_encode)对 JSON 数据进行编码的问题,它将所有 camelCase 转换为 snake_case。不知道这些信息对你有没有帮助。

    无论如何,如果你有同样的问题,这个链接可以帮助你:https://jmsyst.com/libs/serializer/master/reference/annotations。 您可以在 @Accessor 注释中定义自己的 getter 和 setter。

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多