2017-06-22 194 views
0

我最可能与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); 
    } 
  1. 问题是,当我序列,仅__class__是串行,data不是阵列的甚至一部分。

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

回答

-1

我也有类似的问题。我的目标的一部分是通过JMS串行忽视,当我做:

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

据我所知,这个问题是getter和我的驼峰对象属性的制定者。

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

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

相关问题