将复杂对象图序列化为 XML 并返回
Serialize Complex Object Graph to XML and Back
问题
我有以下对象图:
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>
反序列化使用如下代码:
$this->get("serializer")->deserialize($s, 'AppBundle\Controller\Person', 'xml');
正在回馈以下内容:
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>
其次,我怎样才能将它反序列化回对象图(人和电话),一旦使用简单的反序列化它 returns 一个对象 person 具有一组电话,它包含一个关联数组而不是 Telephone
个对象。
模型/控制器
这是我的模型/控制器类:
<?php
namespace AppBundle\Controller;
class Person {
private $name;
private $age;
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;
class Telephone {
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 序列化程序的这个问题,如下所示:
<?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;
}
}
据我了解,当您执行 $this->get('serializer')
时,您将获得 Symfony Serialization component. I'm not entirely familiar with it (you'll see why in a tick) but their documentation does highlight how to handle object properties 尽管仅用于序列化。
对于您似乎正在寻找的对序列化视图的控制类型,我强烈建议 JMS serializer (and associated bundle),它可以让您通过注释或外部配置对输出进行更精细的控制。在你的情况下,做:
use JMS\Serializer\Annotation as Serializer;
class Person
{
/**
* @Serializer\Type("array<Telephone>")
*/
private $phones;
可能足以获得您正在寻找的双向序列化。
问题
我有以下对象图:
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>
反序列化使用如下代码:
$this->get("serializer")->deserialize($s, 'AppBundle\Controller\Person', 'xml');
正在回馈以下内容:
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>
其次,我怎样才能将它反序列化回对象图(人和电话),一旦使用简单的反序列化它 returns 一个对象 person 具有一组电话,它包含一个关联数组而不是 Telephone
个对象。
模型/控制器
这是我的模型/控制器类:
<?php
namespace AppBundle\Controller;
class Person {
private $name;
private $age;
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;
class Telephone {
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 序列化程序的这个问题,如下所示:
<?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;
}
}
据我了解,当您执行 $this->get('serializer')
时,您将获得 Symfony Serialization component. I'm not entirely familiar with it (you'll see why in a tick) but their documentation does highlight how to handle object properties 尽管仅用于序列化。
对于您似乎正在寻找的对序列化视图的控制类型,我强烈建议 JMS serializer (and associated bundle),它可以让您通过注释或外部配置对输出进行更精细的控制。在你的情况下,做:
use JMS\Serializer\Annotation as Serializer;
class Person
{
/**
* @Serializer\Type("array<Telephone>")
*/
private $phones;
可能足以获得您正在寻找的双向序列化。