2017-06-22 153 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。