簡體   English   中英

Symfony串行器將帶有子級的XML反序列化為對象

[英]Symfony Serializer Deserializing XML into Object with children

我有以下XML:

<CinemaListExport>
    <Cinema>
        ....
        <screens>
            <screen></screen>
            <screen></screen>
        </screens>
    </Cinema>
    <Cinema>
    ....
    </Cinema>
<CinemaListExport>

我試圖將其轉換為以下對象:

class CinemaList
{
    /**
     * @var Cinema[]
     */
    public $cinema;

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

    public function addCinema(Cinema $cinema)
    {
        $this->cinema[] = $cinema;
    }
class Cinema
{
    fields...

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

使用以下代碼:

        $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包含所有電影院,而每個Cinema包含所有屏幕

好吧,我不得不開發您的解決方案並進行一些搜索以了解為什么這個簡單的用例無法正常工作。

首先,您錯過了規范化器ArrayDenormalizer它需要反序列化電影和屏幕的集合:

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()]
);

沒有此規范化器的數組和集合將被跳過。

關於序列化/反序列化,特別是使用使用PropertyAccess組件的ObjectNormalizer ,還有另一件事。

如果要使其工作,則必須同時實現方法添加adderremover

PropertyAccessor :: writeProperty方法中發生了很多事情。 我不會解釋所有的機制,但是很快:如果您有方法addXXX和removeXXX,則將優先使用addXXX。 照顧自己 ! 如果您僅具有addXXX方法,則將不會使用該方法……我不知道他們為什么這樣做,但當然有充分的理由。 第二個選項是二傳手。 如果存在(並且您沒有removeXXX或addXXX),那么它將用於添加集合中的項目。

這里

我在一個新的symfony項目中進行了一些成功的測試。 如果您仍然遇到問題,我們將很樂意為您提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM