2017-06-22 6 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. 私は同様の問題があった

答えて

-1

{"__class__":"MyBundle\\MyDTO","data":{"prop1":["x","xx"],"prop2":"x"}}デシリアライズすることができるはずです。私が行うとき私のオブジェクトの一部は、JMSシリアライザによって無視されました:

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

私は問題はゲッターと私のキャメルケースオブジェクトのプロパティのセッターであることを理解しています。

JMSシリアライザ(最初はサンプルjson_encode)でJSONデータをエンコードする際の問題を修正しました。これはsnake_caseのすべてのcamelCaseを変換します。この情報があなたに役立つかどうかわかりません。

同じ問題が発生した場合は、https://jmsyst.com/libs/serializer/master/reference/annotationsにリンクしてください。 @Accessorアノテーションで独自のゲッターとセッターを定義することができます。

関連する問題