首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony序列化器将XML反序列化为带有子对象的对象

Symfony序列化器将XML反序列化为带有子对象的对象
EN

Stack Overflow用户
提问于 2019-05-08 13:01:57
回答 1查看 1.2K关注 0票数 0

我有以下XML:

代码语言:javascript
复制
<CinemaListExport>
    <Cinema>
        ....
        <screens>
            <screen></screen>
            <screen></screen>
        </screens>
    </Cinema>
    <Cinema>
    ....
    </Cinema>
<CinemaListExport>

我试图将其转换为以下对象:

代码语言:javascript
复制
class CinemaList
{
    /**
     * @var Cinema[]
     */
    public $cinema;

    public function __construct()
    {
        $this->cinema = new ArrayCollection();
    }

    public function addCinema(Cinema $cinema)
    {
        $this->cinema[] = $cinema;
    }
代码语言:javascript
复制
class Cinema
{
    fields...

    /**
     * @var Screen[]
     */
    public $screens = [];

使用以下代码:

代码语言:javascript
复制
        $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');

无论我做什么,我总是能得到以下信息:

代码语言:javascript
复制
class CinemaList#265 (1) {
  public $cinema =>
  class Doctrine\Common\Collections\ArrayCollection#317 (1) {
    private $elements =>
    array(0) {
    }
  }
}

谁能给我指明正确的方向?我在这里做错什么了?我只需要CinemaList包含所有电影院,每家电影院都包含所有屏幕

EN

回答 1

Stack Overflow用户

发布于 2019-05-08 17:18:09

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

首先,您错过了规范化程序ArrayDenormalizer,需要取消您的影院和屏幕集合的序列化:

代码语言:javascript
复制
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;

$objectNormalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());

$serializer = new Serializer(
    [new ArrayDenormalizer(), $objectNormalizer], [new XmlEncoder()]
);

如果没有这个规范化器数组和集合,就会跳过。

序列化/非序列化还有另外一件事,尤其是使用ObjectNormalizer组件的PropertyAccess

如果要使方法adderremover工作,就必须同时实现它。

PropertyAccessor::writeProperty方法中发生了很多事情。我不会解释所有的机制主义,但很快:如果您有addXXX和removeXXX方法,那么addXXX将被优先使用。保重!如果您只有addXXX方法,那么它将不被使用…我不知道他们为什么这么做,但肯定有一个很好的理由。第二个选项是策划者。如果它存在(而且您没有removeXXX或addXXX),那么它将用于从集合中添加项。

来自这里

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56041446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档