2017-06-22 1 views
0

Je suis probablement confondu avec le mécanisme des visiteurs dans JMS. Mais je veux y parvenir:Le sérialiseur JMS sérialise l'objet personnalisé et le désérialise

classe serialize à JSON et à l'arrière avec l'ajout de propriété personnalisée classe qui indique dans quelle désérialisation classe devrait être faite.

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. Le problème est quand je ne sérialiser, que __class__ est sérialiseur, data est même pas partie du tableau.

  2. Je devrais pouvoir désérialiser {"__class__":"MyBundle\\MyDTO","data":{"prop1":["x","xx"],"prop2":"x"}}

Répondre

-1

J'ai eu un problème similaire. Une partie de mon objet était ignorer par JMS sérialiseur quand je fais:

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

Je comprends que le problème est les getters et les setters de mes propriétés de l'objet camelCase.

J'ai résolu mon problème avec l'encodage de mes données JSON avec JMS Serializer (initialement avec un exemple json_encode), il convertit tout camelCase dans snake_case. Je ne sais pas si cette information peut vous aider.

De toute façon, si vous avez le même problème, ce lien peut vous aider: https://jmsyst.com/libs/serializer/master/reference/annotations. Vous pouvez définir votre propre getter et setter dans l'annotation @Accessor.