Serializer组件
编辑本页
如上图所示,数组被用作对象和序列化内容之间的中介。这样,编码器将只处理特定的转向格式成数组反之亦然。同样,Normalizers将处理转向特定对象成数组反之亦然。
序列化是一个复杂的主题。这个组件可能无法覆盖您的所有用例,但它对于开发序列化和反序列化对象的工具非常有用。
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
使用ObjectNormalizer
,PropertyAccess组件也必须安装。
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
ObjectNormalizer
,PropertyAccess组件也必须安装。
另请参阅
本文解释了Serializer的原理,并让您熟悉规范化器和编码器的概念。代码示例假设您使用Serializer作为一个独立的组件。如果您正在Symfony应用程序中使用Serializer,请阅读ob娱乐下载如何使用序列化器在你读完这篇文章之后。
要使用Serializer组件,请设置序列化器指定哪些编码器和规范化器将可用:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\编码器\XmlEncoder;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;$编码器= (新XmlEncoder (),新JsonEncoder ()];$标准化者= (新ObjectNormalizer ()];$序列化器=新序列化器($标准化者,$编码器);
首选的归一化器是ObjectNormalizer,但其他归一化器是可用的。下面显示的所有示例都使用ObjectNormalizer
.
现在,如果你想将这个对象序列化为JSON,你只需要使用之前创建的Serializer服务:
12 3 4 5 6 7 8 9 10 11 12
使用应用程序\模型\人;$人=新人();$人->setName (“foo”);$人->setAge (99);$人->setSportsperson (假);$jsonContent=$序列化器->序列化($人,json的);// $jsonContent包含{"name":"foo","age":99,"sportsperson":false,"createdAt":null}回声$jsonContent;//或在响应中返回它
的第一个参数serialize ()在这种情况下,对象是要序列化的,第二个是用来选择合适的编码器的吗JsonEncoder.
人类将以XML格式编码:
1 2 3 4 5 6 7 8 9 10 11
使用应用程序\模型\人;$数据=<< foo 99 false EOF; $人=$序列化器->反序列化($数据,人::类,“xml”);
在这种情况下,反序列化()需要三个参数:
- 要解码的信息
- 此信息将被解码到的类的名称
- 用于将该信息转换为数组的编码器
默认情况下,没有映射到非规范化对象的附加属性将被Serializer组件忽略。如果希望在发生这种情况时抛出异常,请设置AbstractNormalizer: ALLOW_EXTRA_ATTRIBUTES
上下文选项。假
并提供一个实现ClassMetadataFactoryInterface
在构造规范化器时:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用应用程序\模型\人;$数据=< < < EOF <人> <名称> foo < /名称> < > 99岁年龄< / > < >城市巴黎城市< / > < > /人EOF;// $loader是本文后面解释的任何有效加载器$classMetadataFactory=新ClassMetadataFactory ($加载程序);$标准化者=新ObjectNormalizer ($classMetadataFactory);$序列化器=新序列化器([$标准化者]);//这将抛出Symfony\Componeob娱乐下载nt\Serializer\Exception\ExtraAttributesException//因为“city”不是Person类的属性$人=$序列化器->反序列化($数据,人::类,“xml”, [AbstractNormalizer .::ALLOW_EXTRA_ATTRIBUTES = >假]);
这是使用ORM时的一个常见需求。
的AbstractNormalizer: OBJECT_TO_POPULATE
仅用于顶级对象。如果该对象是树结构的根,那么规范化数据中存在的所有子元素都将使用新实例重新创建。
当AbstractObjectNormalizer: DEEP_OBJECT_TO_POPULATE
选项设置为true,即根的现有子节点OBJECT_TO_POPULATE
从规范化数据更新,而不是由反规范化程序重新创建它们。请注意,DEEP_OBJECT_TO_POPULATE
只适用于单个子对象,但不适用于对象数组。当它们出现在规范化数据中时,仍然会被替换。
1 2 3 4 5 6 7 8 9 10 11
使用应用程序\模型\人;$数据=<< foo 99 false EOF; $人=$序列化器->反序列化($数据,人::类,“xml”);
AbstractNormalizer: ALLOW_EXTRA_ATTRIBUTES
上下文选项。假
并提供一个实现ClassMetadataFactoryInterface
在构造规范化器时:12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用应用程序\模型\人;$数据=< < < EOF <人> <名称> foo < /名称> < > 99岁年龄< / > < >城市巴黎城市< / > < > /人EOF;// $loader是本文后面解释的任何有效加载器$classMetadataFactory=新ClassMetadataFactory ($加载程序);$标准化者=新ObjectNormalizer ($classMetadataFactory);$序列化器=新序列化器([$标准化者]);//这将抛出Symfony\Componeob娱乐下载nt\Serializer\Exception\ExtraAttributesException//因为“city”不是Person类的属性$人=$序列化器->反序列化($数据,人::类,“xml”, [AbstractNormalizer .::ALLOW_EXTRA_ATTRIBUTES = >假]);
AbstractNormalizer: OBJECT_TO_POPULATE
仅用于顶级对象。如果该对象是树结构的根,那么规范化数据中存在的所有子元素都将使用新实例重新创建。AbstractObjectNormalizer: DEEP_OBJECT_TO_POPULATE
选项设置为true,即根的现有子节点OBJECT_TO_POPULATE
从规范化数据更新,而不是由反规范化程序重新创建它们。请注意,DEEP_OBJECT_TO_POPULATE
只适用于单个子对象,但不适用于对象数组。当它们出现在规范化数据中时,仍然会被替换。序列化的定义可以使用注释、XML或YAML来指定。的ClassMetadataFactory归一化器将使用的对象必须知道要使用的格式。
对象的初始化方法的代码如下ClassMetadataFactory对于每种格式:
PHP文件中的注释:
1 2 3 4 5
使用学说\常见的\注释\AnnotationReader;使用ob娱乐下载\组件\序列化器\映射\工厂\ClassMetadataFactory;使用ob娱乐下载\组件\序列化器\映射\加载程序\AnnotationLoader;$classMetadataFactory=新ClassMetadataFactory (新AnnotationLoader (新AnnotationReader ()));
YAML文件:
1 2 3 4
使用ob娱乐下载\组件\序列化器\映射\工厂\ClassMetadataFactory;使用ob娱乐下载\组件\序列化器\映射\加载程序\YamlFileLoader;$classMetadataFactory=新ClassMetadataFactory (新YamlFileLoader (“/道路/ /你/ definition.yaml”));
XML文件:
1 2 3 4
使用ob娱乐下载\组件\序列化器\映射\工厂\ClassMetadataFactory;使用ob娱乐下载\组件\序列化器\映射\加载程序\XmlFileLoader;$classMetadataFactory=新ClassMetadataFactory (新XmlFileLoader (“/道路/ /你/ definition.xml”));
然后,创建你的组定义:
- 注释
- 属性
- YAML
- XML
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
名称空间Acme;使用ob娱乐下载\组件\序列化器\注释\组;类MyObj{/ * * *@Groups({"group1", "group2"}) */公共$喷火;/ * * *@Groups({}“group4”)* /公共$anotherProperty;/ * * *@Groups(“group3”)* /公共函数getBar()//是*方法是也支持{返回$这->酒吧;}/ /……}
你现在只能序列化你想要的组中的属性:
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 30
使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;$obj=新MyObj ();$obj->foo =“foo”;$obj->anotherProperty =“anotherProperty”;$obj->setBar (“酒吧”);$标准化者=新ObjectNormalizer ($classMetadataFactory);$序列化器=新序列化器([$标准化者]);$数据=$序列化器->正常化($obj,零, (“组织”= >“group1”]);// $data = ['foo' => 'foo'];$methoda=$序列化器->denormalize ([“foo”= >“foo”,“anotherProperty”= >“anotherProperty”,“酒吧”= >“酒吧”],“MyObj”,零, (“组织”= > [“group1”,“group3”]]);// $obj2 = MyObj(foo: 'foo', bar: 'bar')//在' groups '中使用特殊值' * '$obj3=$序列化器->denormalize ([“foo”= >“foo”,“anotherProperty”= >“anotherProperty”,“酒吧”= >“酒吧”],“MyObj”,零, (“组织”= > [‘*’]]);// $obj2 = MyObj(foo: 'foo', anotherProperty: 'anotherProperty', bar: 'bar')
5.2
的*
特殊值为组
在Symfony 5.2中引入。ob娱乐下载