Php Symfony序列化程序将XML反序列化为具有子对象的对象

Php Symfony序列化程序将XML反序列化为具有子对象的对象,php,serialization,symfony4,Php,Serialization,Symfony4,我有以下XML: <CinemaListExport> <Cinema> .... <screens> <screen></screen> <screen></screen> </screens> </Cinema> <Cinema> ....

我有以下XML:

<CinemaListExport>
    <Cinema>
        ....
        <screens>
            <screen></screen>
            <screen></screen>
        </screens>
    </Cinema>
    <Cinema>
    ....
    </Cinema>
<CinemaListExport>
使用以下代码:

        $normalizers = [
            new ArrayDenormalizer(),
            new ObjectNormalizer(null, null, null, new ReflectionExtractor())
        ];
        $encoders = [new XmlEncoder()];

        $serializer = new Serializer($normalizers, $encoders);


        $res = $serializer->deserialize($xml, CinemaList::class, 'xml');
无论我做什么,我总是得到以下信息:

class CinemaList#265 (1) {
  public $cinema =>
  class Doctrine\Common\Collections\ArrayCollection#317 (1) {
    private $elements =>
    array(0) {
    }
  }
}
谁能给我指出正确的方向吗?我做错了什么?
我只需要CinemaList来包含所有的电影院和每个电影院来包含所有的屏幕

好吧,我必须开发您的解决方案并进行一些搜索,以了解为什么这个简单的用例不起作用

首先,您错过了normalizer
ArraydNormalizer
它需要取消影院和屏幕集合的序列化:

使用Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
使用Symfony\Component\Serializer\Encoder\xmlcoder;
使用Symfony\Component\Serializer\Normalizer\arraydesnormalizer;
使用Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
使用Symfony\Component\Serializer\Serializer;
$objectNormalizer=newObjectNormalizer(null,null,null,newReflectionExtractor());
$serializer=新序列化程序(
[new ArrayDenormalizer(),$objectNormalizer],[new XmlEncoder()]
);
如果没有这个规范化器,数组和集合将被跳过

序列化/非序列化还有另一个方面,特别是使用
PropertyAccess
组件的
ObjectNormalizer

如果你想让它工作,你必须同时实现加法器和移除器

在PropertyAccessor::writeProperty方法中发生了很多事情。我不会解释所有的mecanism,但很快:如果您有addXXX和removeXXX方法,那么addXXX将优先使用。当心!如果你只有addXXX方法,那么它将不会被使用…我不知道他们为什么这样做,但肯定有一个很好的理由。 第二个选项是setter。如果它存在(并且您没有removeXXX或addXXX),那么它将用于添加集合中的项目


我在一个新的symfony项目中做了一些成功的测试。如果您仍然遇到问题,我很乐意帮助您。

谢谢。我正在审查的链接,并将尝试它。不知道为什么这个序列化程序需要如此复杂。。。
        $normalizers = [
            new ArrayDenormalizer(),
            new ObjectNormalizer(null, null, null, new ReflectionExtractor())
        ];
        $encoders = [new XmlEncoder()];

        $serializer = new Serializer($normalizers, $encoders);


        $res = $serializer->deserialize($xml, CinemaList::class, 'xml');
class CinemaList#265 (1) {
  public $cinema =>
  class Doctrine\Common\Collections\ArrayCollection#317 (1) {
    private $elements =>
    array(0) {
    }
  }
}