Serializer组件
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.4,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
Serializer组件
Serializer组件用于将对象转换为特定的格式(XML、JSON、YAML等),或者将对象转换为特定的格式。
为此,Serializer组件遵循以下简单模式。
正如你在上图中看到的,一个数组被用作中间的一个人。这样,编码器将只处理特定的转向格式成数组反之亦然。同样,Normalizers将处理转向特定对象成数组反之亦然。
序列化是一个复杂的主题,虽然这个组件可能不是在所有情况下都能工作,但在开发序列化和反序列化对象的工具时,它可能是一个有用的工具。
安装
你可以用两种不同的方式安装组件:
- 通过Composer安装(
欧宝娱乐app下载地址symfony /序列化器
在Packagist); - 使用官方Git存储库(https://github.com/欧宝娱乐app下载地址symfony/Serializer).
使用
使用Serializer组件非常简单。你只需要设置序列化器指定哪些Encoders和Normalizer是可用的:
1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\序列化器\序列化器;使用欧宝娱乐app下载地址\组件\序列化器\编码器\XmlEncoder;使用欧宝娱乐app下载地址\组件\序列化器\编码器\JsonEncoder;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\GetSetMethodNormalizer;$编码器=数组(新XmlEncoder (),新JsonEncoder ());$标准化者=数组(新GetSetMethodNormalizer ());$序列化器=新序列化器($标准化者,$编码器);
序列化对象
在这个例子中,假设你的项目中已经存在以下类:
12 3 4 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
名称空间Acme;类人{私人$年龄;私人$的名字;/ /读取器公共函数getName(){返回$这->名称;}公共函数getAge(){返回$这->年龄;}/ / setter公共函数setName($的名字){$这->name =$的名字;}公共函数setAge($年龄){$这->年龄=$年龄;}}
现在,如果你想将这个对象序列化为JSON,你只需要使用之前创建的Serializer服务:
1 2 3 4 5 6 7 8 9
$人=新Acme \人();$人->setName (“foo”);$人->setAge (99);$jsonContent=$序列化器->序列化($人,json的);// $jsonContent包含{"name":"foo","age":99}回声$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"}
反序列化一个对象
现在你将学习如何做完全相反的事情。这一次,信息的人
类将以XML格式编码:
1 2 3 4 5 6 7 8
$数据=< < < EOF <人> <名称> foo < /名称> < > 99岁年龄< / > < > /人EOF;$人=$序列化器->反序列化($数据,“Acme \人”,“xml”);
在这种情况下,反序列化()需要三个参数:
- 要解码的信息
- 此信息将被解码到的类的名称
- 用于将该信息转换为数组的编码器
为强调的属性使用驼峰化方法名
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
方法。
使用回调序列化对象实例的属性
当序列化时,你可以设置一个回调来格式化一个特定的对象属性:
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 "}
JMSSerializer
一个流行的第三方库,JMS序列化器,提供了更复杂的解决方案。这个库包括配置如何通过注释(以及YAML、XML和PHP)序列化/反序列化对象的能力,与Doctrine ORM集成,以及处理其他复杂情况(例如循环引用)。