Serializer组件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.6,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

Serializer组件

Serializer组件用于将对象转换为特定的格式(XML、JSON、YAML等),或者将对象转换为特定的格式。

为此,Serializer组件遵循以下简单模式。

正如你在上图中看到的,一个数组被用作中间的一个人。这样,编码器将只处理特定的转向格式数组反之亦然。同样,Normalizers将处理转向特定对象数组反之亦然。

序列化是一个复杂的主题,虽然这个组件可能不是在所有情况下都能工作,但在开发序列化和反序列化对象的工具时,它可能是一个有用的工具。

安装

你可以用两种不同的方式安装组件:

然后,要求供应商/ autoload.php文件以启用Composer提供的自动加载机制。否则,您的应用程序将无法找到这个Symfony组件的类。欧宝娱乐app下载地址

使用

使用Serializer组件非常简单。你只需要设置序列化器指定哪些Encoders和Normalizer是可用的:

1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址组件序列化器序列化器使用欧宝娱乐app下载地址组件序列化器编码器XmlEncoder使用欧宝娱乐app下载地址组件序列化器编码器JsonEncoder使用欧宝娱乐app下载地址组件序列化器标准化者GetSetMethodNormalizer编码器数组XmlEncoder (),JsonEncoder ());标准化者数组GetSetMethodNormalizer ());序列化器序列化器(标准化者编码器);

有几个标准化器可用,例如GetSetMethodNormalizer或者是PropertyNormalizer.有关它们的更多信息,请参阅标准化者部分。下面显示的所有示例都使用GetSetMethodNormalizer

序列化对象

在这个例子中,假设你的项目中已经存在以下类:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
名称空间Acme私人年龄私人的名字私人运动员/ /读取器公共函数getName()返回->名称;}公共函数getAge()返回->年龄;}/ /伊塞公共函数isSportsman()返回->运动员;}/ / setter公共函数setName的名字->name =的名字;}公共函数setAge年龄->年龄=年龄;}公共函数setSportsman运动员->运动员=运动员;}}

现在,如果你想将这个对象序列化为JSON,你只需要使用之前创建的Serializer服务:

1 2 3 4 5 6 7 8 9 10
Acme \人();->setName (“foo”);->setAge (99);->setSportsman ();jsonContent序列化器->序列化(json的);// $jsonContent包含{"name":"foo","age":99,"sportsman":false}回声jsonContent//或在响应中返回它

的第一个参数serialize ()在这种情况下,对象是要序列化的,第二个是用来选择合适的编码器的吗JsonEncoder

在序列化时忽略属性

2.3

GetSetMethodNormalizer: setIgnoredAttributes方法是在Symfony 2.3中引入的。欧宝娱乐app下载地址

作为一个选项,有一种方法可以在序列化时忽略来自源对象的属性。要删除这些属性,请使用setIgnoredAttributes ()方法的规范化定义:

1 2 3 4 5 6 7 8 9 10
使用欧宝娱乐app下载地址组件序列化器序列化器使用欧宝娱乐app下载地址组件序列化器编码器JsonEncoder使用欧宝娱乐app下载地址组件序列化器标准化者GetSetMethodNormalizer标准化者GetSetMethodNormalizer ();标准化者->setIgnoredAttributes (数组“年龄”));编码器JsonEncoder ();序列化器序列化器(数组标准化者),数组编码器));序列化器->序列化(json的);//输出:{"name":"foo","sportsman":false}

反序列化一个对象

现在你将学习如何做完全相反的事情。这一次,信息的类将以XML格式编码:

1 2 3 4 5 6 7 8 9
数据<< foo 99 false  EOF;序列化器->反序列化(数据“Acme \人”“xml”);

在这种情况下,反序列化()需要三个参数:

  1. 要解码的信息
  2. 此信息将被解码到的类的名称
  3. 用于将该信息转换为数组的编码器

为强调的属性使用驼峰化方法名

2.3

GetSetMethodNormalizer: setCamelizedAttributes方法是在Symfony 2.3中引入的。欧宝娱乐app下载地址

有时来自序列化内容的属性名被强调(例如:first_name).通常,这些属性将使用get/set方法getFirst_name,当getFirstName方法才是你真正想要的。要改变这种行为,请使用setCamelizedAttributes ()方法的规范化定义:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
编码器JsonEncoder ();标准化者GetSetMethodNormalizer ();标准化者->setCamelizedAttributes (数组“first_name”));序列化器序列化器(数组标准化者),数组编码器));json< < <测试结束{“名称”:“foo”,“年龄”:“19”、“first_name”:“酒吧”}传输结束;序列化器->反序列化(json“Acme \人”json的);

作为最后的结果,反序列化程序使用first_name属性,就好像它是firstName并使用getFirstName而且setFirstName方法。

序列化布尔属性

2.5

支持是*访问器在GetSetMethodNormalizer在Symfony 2.5中引入。欧宝娱乐app下载地址

如果您正在使用isser方法(方法前缀为,就像Acme \人::isSportsman ()), Serializer组件将自动检测并使用它来序列化相关属性。

使用回调序列化对象实例的属性

当序列化时,你可以设置一个回调来格式化一个特定的对象属性:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
使用Acme使用欧宝娱乐app下载地址组件序列化器编码器JsonEncoder使用欧宝娱乐app下载地址组件序列化器标准化者GetSetMethodNormalizer使用欧宝娱乐app下载地址组件序列化器序列化器编码器JsonEncoder ();标准化者GetSetMethodNormalizer ();回调函数dateTime返回dateTime运算符\ DateTime吗?dateTime->(\ DateTime格式::ISO8601):;};标准化者->setCallbacks (数组“createdAt”= >回调));序列化器序列化器(数组标准化者),数组编码器));人();->setName (“cordoval”);->setAge (34);->setCreatedAt (\ DateTime (“现在”));序列化器->序列化(json的);/ /输出:{“名称”:“cordoval”,“年龄”:34岁“createdAt”:“2014 - 03 - 22 - t09:43:12 - 0500 "}

标准化者

有几种类型的归一化器可用:

GetSetMethodNormalizer

这个规范化器通过调用“getter”(以“get”开头的公共方法)来读取类的内容。它将通过调用构造函数和“setter”(以“set”开头的公共方法)来反规范化数据。

对象被序列化为属性名(方法名去掉“get”前缀并转换为小写)到属性值的映射。

PropertyNormalizer
此规范化器直接读取和写入公共属性以及私人和受保护的属性。对象被规范化为属性名到属性值的映射。
..versionadded:: 2.6
PropertyNormalizer类在Symfony 2.6中引入。欧宝娱乐app下载地址

处理循环引用

2.6

循环引用的处理是在Symfony 2.6中引入的。欧宝娱乐app下载地址在以前的Symfony版本中,循环引用导致无限循欧宝娱乐app下载地址环。

循环引用在处理实体关系时很常见:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
组织私人的名字私人成员公共函数setName的名字->name =的名字;}公共函数getName()返回->名称;}公共函数setMembers(数组成员->成员=成员;}公共函数getMembers()返回->成员;}}成员私人的名字私人组织公共函数setName的名字->name =的名字;}公共函数getName()返回->名称;}公共函数setOrganization(组织组织->组织=组织;}公共函数getOrganization()返回->组织;}}

为了避免无限循环,GetSetMethodNormalizer抛出一个CircularReferenceException遇到这种情况时:

1 2 3 4 5 6 7 8 9 10
成员成员();成员->setName (“凯文”);org组织();org->setName (“Les-Tilleuls.coop”);org->setMembers (数组成员));成员->setOrganization (org);回声序列化器->序列化(orgjson的);//抛出CircularReferenceException

setCircularReferenceLimit ()方法设置在将同一对象视为循环引用之前序列化该对象的次数。默认值为1

循环引用也可以由自定义调用对象处理,而不是抛出异常。这在序列化具有唯一标识符的实体时特别有用:

1 2 3 4 5 6 7 8 9 10
编码器JsonEncoder ();标准化者GetSetMethodNormalizer ();标准化者->setCircularReferenceHandler (函数对象返回对象->getName ();});序列化器序列化器(数组标准化者),数组编码器));var_dump (序列化器->序列化(orgjson的));/ / {" name ": " Les-Tilleuls。coop","members":[{"name":"K\u00e9vin",组织:" Les-Tilleuls.coop"}]}

JMSSerializer

一个流行的第三方库,JMS序列化器,提供了更复杂的解决方案。这个库包括配置如何通过注释(以及YAML、XML和PHP)序列化/反序列化对象、与Doctrine ORM集成以及处理其他复杂情况的能力。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。