2017-04-03 1 views
0

wie kann ich deserialisieren diese XMLWie kann ein Array komplexer Objekte mit Symfony Serializer deserialisiert werden?

<Outer> 
    <simpleProperty1>A</simpleProperty1> 
    <simpleProperty2>B</simpleProperty2> 
    <Inner> 
     <simpleProperty3>C</simpleProperty3> 
     <simpleProperty4>D</simpleProperty4> 
    </Inner> 
    <Inner> 
     <simpleProperty3>E</simpleProperty3> 
     <simpleProperty4>F</simpleProperty4> 
    </Inner> 
</Outer> 

in einigen PHP-Klassen:

class Outer 
{ 
    /** @var string */ 
    private $simpleProperty1; 
    /** @var string */ 
    private $simpleProperty2; 
    /** @var Inner[] */ 
    private $inners; 

    [insert getters and setters here] 
} 

class Inner 
{ 
    /** @var string */ 
    private $simpleProperty3; 
    /** @var string */ 
    private $simpleProperty4; 

    [insert getters and setters here] 
} 

die Symfony Serializer mit?

Die äußere Objekt und seine einfache Eigenschaften gefüllt sind, aber anstatt des inneren Objektes erhalten I eine assoziative Array zwei assoziative Felder enthält, die den simpleProperty3 und simpleProperty4 enthalten.

+0

Sie einen Blick auf [diese] haben könnte (http://thomas.jarrand.fr/blog/serialisierung /) und Sie müssen wahrscheinlich eine benutzerdefinierte Denormalizer-Funktion definieren. Sie könnten auch [diese Frage] (http://stackoverflow.com/questions/40033732/denormalize-nested-structure-in-objects-with-symfony-2-serializer) – segFault

+0

können Sie ein XML wie oben erstellen mit 'Symfony Serializer'? Dann kannst du es auch wieder 'deserialisieren'. Zurzeit sind die Doku nur mit flachen/einfachen Objekten. Sie können nur etwas in den Getter/Setter für INNER injizieren und die Werte manuell binden. Aber graben besser in die LLinks die @segFault zeigt – JustOnUnderMillions

+0

@JustOnUnderMillions ich serialisieren kann, aber ich kann immer noch nicht deserialisieren –

Antwort

0

konnte ich es mit einem benutzerdefinierten PropertyExtractor lösen, die den Serializer auf den richtigen Typ-Punkte:

$encoders = [new XmlEncoder('response', LIBXML_NOERROR)]; 
$normalizers = [ 
    new ArrayDenormalizer(), 
    new ObjectNormalizer(null, null, null, 
     new class implements PropertyTypeExtractorInterface 
     { 
      private $reflectionExtractor; 

      public function __construct() 
      { 
       $this->reflectionExtractor = new ReflectionExtractor(); 
      } 

      public function getTypes($class, $property, array $context = array()) 
      { 
       if (is_a($class, Outer::class, true) && 'Inner' === $property) { 
       return [ 
        new Type(Type::BUILTIN_TYPE_OBJECT, true, Inner::class . "[]") 
       ]; 
       } 
       return $this->reflectionExtractor->getTypes($class, $property, $context); 
      } 
     }) 
    ]; 
$this->serializer = new Serializer($normalizers, $encoders); 
Verwandte Themen