2017-04-03 69 views
0

我怎么可以反序列化这个XML如何使用Symfony序列化器反序列化复杂对象的数组?

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

到一些PHP类:使用Symfony Serializer

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] 
} 

外部对象及其简单属性被填充,但取代内部对象,我得到一个包含两个关联数组的关联数组,其中包含simpleProperty3simpleProperty4

+0

你可以看看[这里](http://thomas.jarrand.fr/blog/serialization /),你可能需要定义一个自定义的denormalizer函数。 你也可以看看[这个问题](http://stackoverflow.com/questions/40033732/denormalize-nested-structure-in-objects-with-symfony-2-serializer) – segFault

+0

你可以生成一个像上面的XML 'Symfony Serializer'?那么你也可以'反序列化'它再次。目前的文件,只有平坦/简单的物体。你只能在INNER的getter/setter中注入一些东西,并将这些值绑定到manualy。但更好地深入@segFault显示的链接 – JustOnUnderMillions

+0

@JustOnUnderMillions我可以序列化,但我仍然不能反序列化 –

回答

0

我能够与指向串行正确类型的定制PropertyExtractor来解决这个问题:

$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);