Php 将复杂对象图序列化为XML并返回 问题

Php 将复杂对象图序列化为XML并返回 问题,php,symfony,serialization,xml-serialization,symfony-2.7,Php,Symfony,Serialization,Xml Serialization,Symfony 2.7,我有以下对象图: AppBundle\Controller\Person Object ( [name:AppBundle\Controller\Person:private] => Person Name [age:AppBundle\Controller\Person:private] => 10 [phones:AppBundle\Controller\Person:private] => Array ( [

我有以下对象图:

AppBundle\Controller\Person Object
(
    [name:AppBundle\Controller\Person:private] => Person Name
    [age:AppBundle\Controller\Person:private] => 10
    [phones:AppBundle\Controller\Person:private] => Array
        (
            [0] => AppBundle\Controller\Telephone Object
                (
                    [phone:AppBundle\Controller\Telephone:private] => 221-16-78
                )
            [1] => AppBundle\Controller\Telephone Object
                (
                    [phone:AppBundle\Controller\Telephone:private] => 221-16-78
                )
        )
)
以及使用控制器中的以下代码进行序列化:

$s = $this->get("serializer")->serialize($person, 'xml');
这给了我以下的结果:

<response>
  <name>Person Name</name>
  <age>10</age>
  <phones>
    <phone>221-16-78</phone>
  </phones>
  <phones>
    <phone>221-16-78</phone>
  </phones>
</response>
正在返回以下内容:

AppBundle\Controller\Person Object
(
    [name:AppBundle\Controller\Person:private] => Person Name
    [age:AppBundle\Controller\Person:private] => 10
    [phones:AppBundle\Controller\Person:private] => Array
        (
            [0] => Array
                (
                    [phone] => 221-16-78
                )
            [1] => Array
                (
                    [phone] => 221-16-78
                )
        )
)
问题: 首先,是否有如下方式接收xml:

<response>
  <name>Person Name</name>
  <age>10</age>
  <phones>
    <telephone>
      <phone>221-16-78</phone>
    </telephone>
    <telephone>
      <phone>221-16-78</phone>
    </telephone>
  </phones>
</response>
<?php

namespace AppBundle\Controller;

use JMS\Serializer\Annotation\Type;
use JMS\Serializer\Annotation\XmlList;

class Person {

    /**
     * @Type("string")
     */
    private $name;
    /**
     * @Type("integer")
     */
    private $age;
    /**
     * @Type("array<AppBundle\Controller\Telephone>")
     * @XmlList(entry = "telephone")
     */
    private $phones;

    public function getName() {
        return $this->name;
    }

    public function getAge() {
        return $this->age;
    }

    public function getPhones() {
        return $this->phones;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function setAge($age) {
        $this->age = $age;
    }

    public function setPhones($phones) {
        $this->phones = $phones;
    }

}

<?php

namespace AppBundle\Controller;

use JMS\Serializer\Annotation\Type;

class Telephone {

    /**
     * @Type("string")
     */
    private $phone;

    public function getPhone() {
        return $this->phone;
    }

    public function setPhone($phone) {
        $this->phone = $phone;
    }

}
和我的控制器方法:

/**
 * @Route("/", name="homepage")
 */
public function indexAction(Request $request)
{

    $phone1 = new Telephone();
    $phone1->setPhone("221-16-78");

    $phone2 = new Telephone();
    $phone2->setPhone("221-16-78");

    $person = new Person();
    $person->setName("Person Name");
    $person->setAge(10);
    $person->setPhones(array($phone1, $phone2));

    print_r($person);

    $s = $this->get("serializer")->serialize($person, 'xml');
    $p = $this->get("serializer")->deserialize($s, 'AppBundle\Controller\Person', 'xml');

    print_r($p);

}
使用JMS序列化程序的解决方案 通过使用注释(基本上是类型和列表细节)向序列化程序提供一些提示,我能够用JMS序列化程序解决这个问题,如下所示:

<response>
  <name>Person Name</name>
  <age>10</age>
  <phones>
    <telephone>
      <phone>221-16-78</phone>
    </telephone>
    <telephone>
      <phone>221-16-78</phone>
    </telephone>
  </phones>
</response>
<?php

namespace AppBundle\Controller;

use JMS\Serializer\Annotation\Type;
use JMS\Serializer\Annotation\XmlList;

class Person {

    /**
     * @Type("string")
     */
    private $name;
    /**
     * @Type("integer")
     */
    private $age;
    /**
     * @Type("array<AppBundle\Controller\Telephone>")
     * @XmlList(entry = "telephone")
     */
    private $phones;

    public function getName() {
        return $this->name;
    }

    public function getAge() {
        return $this->age;
    }

    public function getPhones() {
        return $this->phones;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function setAge($age) {
        $this->age = $age;
    }

    public function setPhones($phones) {
        $this->phones = $phones;
    }

}

<?php

namespace AppBundle\Controller;

use JMS\Serializer\Annotation\Type;

class Telephone {

    /**
     * @Type("string")
     */
    private $phone;

    public function getPhone() {
        return $this->phone;
    }

    public function setPhone($phone) {
        $this->phone = $phone;
    }

}
名称;
}
公共函数getAge(){
返回$this->age;
}
公共函数getPhones(){
返回$this->phones;
}
公共函数setName($name){
$this->name=$name;
}
公共功能设置($age){
$this->age=$age;
}
公共功能手机($phones){
$this->phones=$phones;
}
}

据我所知,当您执行
$this->get('serializer')
时,您将获得。我并不完全熟悉它(你会在一个勾中看到原因),但他们的文档确实强调了如何只针对序列化

对于您似乎正在寻找的对序列化视图的控制类型,我强烈建议(和)通过注释或外部配置对输出进行更细粒度的控制。在您的情况下,请执行以下操作:

use JMS\Serializer\Annotation as Serializer;

class Person
{
    /**
     * @Serializer\Type("array<Telephone>")
     */
    private $phones;
使用JMS\Serializer\Annotation作为序列化程序;
班主任
{
/**
*@Serializer\Type(“数组”)
*/
私人电话;

可能足以获得您想要的双向序列化。

谢谢您的回答,事实上它使用JMS序列化工作,但如果无法解决此问题,则对symfony2序列化程序感到好奇。在许多情况下,Symfony序列化程序是完全可用的,特别是在您仅进行序列化的情况下(而不是反序列化)对象-即通过API发送JSON。但据我所知,没有办法以JMS序列化程序允许的方式使用它进行复杂的转换,而这正是让示例正常工作所需要的。