序列化器组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
序列化器组件
序列化器组件是用来把对象变成一个特定格式(XML、JSON、YAML…)和其它的方法。
为了这样做,序列化器组件遵循以下简单的模式。
正如你所看到的在上面的图片中,一个数组作为男人在中间。这样,编码器将只处理特定的格式成数组反之亦然。同样,标准化者将处理特定的对象成数组反之亦然。
序列化是一个复杂的话题,虽然这个组件可能不工作在所有情况下,它可以是一个有用的工具在开发工具来进行序列化和反序列化对象。
安装
您可以安装组件在两个不同的方面:
- 安装它通过作曲家(
ob娱乐下载symfony /序列化器
在Packagist); - 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/Serializer)。
然后,需要供应商/ autoload.php
文件,使作曲家提供的半自动的机制。否则,您的应用程序无法找到这个Symfony组件的类。ob娱乐下载
使用
使用序列化器组件是很简单的。你只需要设置序列化器指定编码器和标准化者可用:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\序列化器\序列化器;使用ob娱乐下载\组件\序列化器\编码器\XmlEncoder;使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\标准化者\GetSetMethodNormalizer;美元编码器=数组(新XmlEncoder (),新JsonEncoder ());美元标准化者=数组(新GetSetMethodNormalizer ());美元序列化器=新序列化器(美元标准化者,美元编码器);
有几个标准化者可用,例如GetSetMethodNormalizer或者是PropertyNormalizer。阅读更多关于他们,请参考标准化者这个页面。以下所有的示例使用GetSetMethodNormalizer
。
序列化一个对象
为了这个例子中,假定下面的类已经存在于您的项目:
1 2 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 30 31 32 33 34 35 36 37 38 39 40 41
名称空间Acme;类人{私人美元年龄;私人美元的名字;私人美元运动员;/ /读取器公共函数getName(){返回美元这- >名称;}公共函数getAge(){返回美元这- >年龄;}/ /伊塞公共函数isSportsman(){返回美元这- >运动员;}/ / setter公共函数setName(美元的名字){美元这- >name =美元的名字;}公共函数setAge(美元年龄){美元这- >年龄=美元年龄;}公共函数setSportsman(美元运动员){美元这- >运动员=美元运动员;}}
现在,如果你想要将这个对象序列化为JSON,您只需要使用序列化器服务之前创建:
1 2 3 4 5 6 7 8 9 10
美元人=新Acme \人();美元人- >setName (“foo”);美元人- >setAge (99年);美元人- >setSportsman (假);美元jsonContent=美元序列化器- >序列化(美元人,json的);/ / $ jsonContent包含{“名称”:“foo”,“年龄”:99年,“运动员”:假}回声美元jsonContent;/ /或返回一个响应
的第一个参数serialize ()是对象进行序列化和第二个用于选择合适的编码器,在这种情况下吗JsonEncoder。
序列化时忽略属性
2.3
的GetSetMethodNormalizer: setIgnoredAttributes方法是在Symfony 2.3中引入的。ob娱乐下载
作为一个选项,有一种无视属性从原点对象序列化。删除那些属性使用setIgnoredAttributes ()方法标准化者定义:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\序列化器\序列化器;使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\标准化者\GetSetMethodNormalizer;美元标准化者=新GetSetMethodNormalizer ();美元标准化者- >setIgnoredAttributes (数组(“年龄”));美元编码器=新JsonEncoder ();美元序列化器=新序列化器(数组(美元标准化者),数组(美元编码器));美元序列化器- >序列化(美元人,json的);/ /输出:{“名称”:“foo”、“运动员”:假}
反序列化一个对象
你现在学习如何做完全相反。这一次,信息的人
类将在XML格式编码:
1 2 3 4 5 6 7 8 9
美元数据=< < < EOF foo <人> <名称> < /名称> <时代> 99 < /年龄> <运动员>假< /运动员> < /人> EOF;美元人=美元序列化器- >反序列化(美元数据,“Acme \人”,“xml”);
在这种情况下,反序列化()需要三个参数:
- 是解码的信息
- 这类的名称将解码的信息
- 使用的编码器将这些信息转化为一个数组
强调使用Camelized方法名称的属性
2.3
的GetSetMethodNormalizer: setCamelizedAttributes方法是在Symfony 2.3中引入的。ob娱乐下载
有时从序列化属性名称内容凸显了(如first_name
)。通常,这些属性将使用get / set方法getFirst_name
,当getFirstName
方法是你真正想要的东西。使用改变这一行为setCamelizedAttributes ()方法标准化者定义:
1 2 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中引入的。ob娱乐下载
如果您使用的是伊塞方法(前缀的方法是
,就像Acme \人::isSportsman ()
),序列化器组件会自动检测和使用它来序列化相关属性。
使用回调函数来序列化属性与对象实例
序列化时,你可以设置一个回调格式特定对象属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
使用Acme\人;使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\标准化者\GetSetMethodNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;美元编码器=新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”(公共方法从“获得”)。应该将正规化数据通过调用构造函数和“setter”(公共方法从“设置”)。
对象序列化的属性名称的地图(方法名被“获得”的前缀和转换为小写)属性值。
- PropertyNormalizer
- 这种标准化者直接读写以及公共属性私有和保护属性。对象是规范化的地图属性名称属性值。
- . .versionadded:: 2.6
- PropertyNormalizer类是在Symfony 2.6中引入的。ob娱乐下载
处理循环引用
2.6
处理循环引用是在Symfony 2.6中引入的。ob娱乐下载在早期版本的Symfony,循环引用导致无限循环ob娱乐下载。
循环引用是常见的在处理实体关系:
1 2 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 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);回声美元序列化器- >序列化(美元org,json的);/ /抛出CircularReferenceException
的setCircularReferenceLimit ()
方法的标准化者设置的次数将序列化相同的对象在考虑前一个循环引用。它的默认值是1
。
而不是抛出异常,循环引用也可以由自定义可调用的。这是特别有用,当序列化实体拥有独特的标识符:
1 2 3 4 5 6 7 8 9 10
美元编码器=新JsonEncoder ();美元标准化者=新GetSetMethodNormalizer ();美元标准化者- >setCircularReferenceHandler (函数(美元对象){返回美元对象- >getName ();});美元序列化器=新序列化器(数组(美元标准化者),数组(美元编码器));var_dump (美元序列化器- >序列化(美元org,json的));/ / {" name ": " Les-Tilleuls。鸡笼”、“成员”:[{“名称”:“K \ u00e9vin”,组织:“Les-Tilleuls.coop”}]}
JMSSerializer
一个流行的第三方库,JMS序列化器,提供了一个更复杂的但更复杂的解决方案。这个库包含配置的能力应该如何序列化/逆序列化对象通过注释(YAML、XML和PHP),与教义ORM的集成,以及其他处理复杂的情况。