序列化器组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
正如你所看到的在上面的图片中,一个数组之间的中间层使用对象和序列化的内容。这样,编码器将只处理特定的格式成数组反之亦然。同样,标准化者将处理特定的对象成数组反之亦然。
序列化是一个复杂的主题。这个组件可能无法覆盖所有你的用例的盒子,但它可能是有用的开发工具来进行序列化和反序列化对象。
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
使用ObjectNormalizer
,PropertyAccess组件还必须安装。
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
ObjectNormalizer
,PropertyAccess组件还必须安装。
另请参阅
本文解释的哲学序列化器,让你熟悉的概念标准化者和编码器。代码示例假设您使用序列化器作为一个独立的组件。如果您正在使用Symfony的序列化器应用程序,阅读ob娱乐下载如何使用序列化器吗当你完成这篇文章。
使用序列化器组件,设置序列化器指定编码器和标准化者可用:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\编码器\XmlEncoder;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;美元编码器= (新XmlEncoder (),新JsonEncoder ()];美元标准化者= (新ObjectNormalizer ()];美元序列化器=新序列化器(美元标准化者,美元编码器);
首选的标准化者ObjectNormalizer,但其它标准化者是可用的。以下所有的示例使用ObjectNormalizer
。
现在,如果你想要将这个对象序列化为JSON,您只需要使用序列化器服务之前创建:
1 2 3 4 5 6 7 8 9 10 11 12
使用应用程序\模型\人;美元人=新人();美元人- >setName (“foo”);美元人- >setAge (99年);美元人- >setSportsperson (假);美元jsonContent=美元序列化器- >序列化(美元人,json的);/ / $ jsonContent包含{“名称”:“foo”,“年龄”:99年,“运动员”:假的,“createdAt”:零}回声美元jsonContent;/ /或返回一个响应
的第一个参数serialize ()是对象进行序列化和第二个用于选择合适的编码器,在这种情况下吗JsonEncoder。
人类将在XML格式编码:
1 2 3 4 5 6 7 8 9 10 11
使用应用程序\模型\人;美元数据=< < < EOF foo <人> <名称> < /名称> <时代> 99 < /年龄> <运动员>假< /运动员> < /人> EOF;美元人=美元序列化器- >反序列化(美元数据,人::类,“xml”);
在这种情况下,反序列化()需要三个参数:
- 是解码的信息
- 这类的名称将解码的信息
- 使用的编码器将这些信息转化为一个数组
默认情况下,附加属性不映射到规范化的对象序列化器组件将被忽略。如果你喜欢抛出一个异常,当这一切发生的时候,设置AbstractNormalizer: ALLOW_EXTRA_ATTRIBUTES
上下文选项假
并提供一个对象实现ClassMetadataFactoryInterface
当构建标准化者:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用应用程序\模型\人;美元数据=< < < EOF foo <人> <名称> < /名称> <时代> 99 < /年龄> <城市> < /城市> < /人> EOF巴黎;/ /美元装载机是任何有效的加载器在本文稍后解释美元classMetadataFactory=新ClassMetadataFactory (美元加载程序);美元标准化者=新ObjectNormalizer (美元classMetadataFactory);美元序列化器=新序列化器([美元标准化者]);/ /这将抛出一个Symfony \序列化ob娱乐下载器\ \组件异常\ ExtraAttributesException/ /因为“城市”不是一个Person类的属性美元人=美元序列化器- >反序列化(美元数据,人::类,“xml”,(AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES = >假]);
这是一个常见的需要在处理一个ORM。
的AbstractNormalizer: OBJECT_TO_POPULATE
只是用于顶层对象。如果对象是一个树结构的根源,规范化数据中存在的所有子元素将重新创建新实例。
当AbstractObjectNormalizer: DEEP_OBJECT_TO_POPULATE
选项设置为true,现有的根的孩子OBJECT_TO_POPULATE
从规范化数据更新,而不是denormalizer重新创建它们。请注意,DEEP_OBJECT_TO_POPULATE
只适用于单一的子对象,而不是对象的数组。这些仍将取代现在的规范化数据。
4.3
的AbstractObjectNormalizer: DEEP_OBJECT_TO_POPULATE
选项是在Symfony 4.3中引入的。ob娱乐下载
1 2 3 4 5 6 7 8 9 10 11
使用应用程序\模型\人;美元数据=< < < EOF foo <人> <名称> < /名称> <时代> 99 < /年龄> <运动员>假< /运动员> < /人> EOF;美元人=美元序列化器- >反序列化(美元数据,人::类,“xml”);
AbstractNormalizer: ALLOW_EXTRA_ATTRIBUTES
上下文选项假
并提供一个对象实现ClassMetadataFactoryInterface
当构建标准化者:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用应用程序\模型\人;美元数据=< < < EOF foo <人> <名称> < /名称> <时代> 99 < /年龄> <城市> < /城市> < /人> EOF巴黎;/ /美元装载机是任何有效的加载器在本文稍后解释美元classMetadataFactory=新ClassMetadataFactory (美元加载程序);美元标准化者=新ObjectNormalizer (美元classMetadataFactory);美元序列化器=新序列化器([美元标准化者]);/ /这将抛出一个Symfony \序列化ob娱乐下载器\ \组件异常\ ExtraAttributesException/ /因为“城市”不是一个Person类的属性美元人=美元序列化器- >反序列化(美元数据,人::类,“xml”,(AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES = >假]);
AbstractNormalizer: OBJECT_TO_POPULATE
只是用于顶层对象。如果对象是一个树结构的根源,规范化数据中存在的所有子元素将重新创建新实例。AbstractObjectNormalizer: DEEP_OBJECT_TO_POPULATE
选项设置为true,现有的根的孩子OBJECT_TO_POPULATE
从规范化数据更新,而不是denormalizer重新创建它们。请注意,DEEP_OBJECT_TO_POPULATE
只适用于单一的子对象,而不是对象的数组。这些仍将取代现在的规范化数据。4.3
的AbstractObjectNormalizer: DEEP_OBJECT_TO_POPULATE
选项是在Symfony 4.3中引入的。ob娱乐下载
可以使用注释指定序列化的定义,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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
名称空间Acme;使用ob娱乐下载\组件\序列化器\注释\组;类MyObj{/ * * *@Groups({“group1”、“group2”}) * /公共美元喷火;/ * * *@Groups(“group3”) * /公共函数getBar()/ /是*方法是也支持{返回美元这- >酒吧;}/ /……}
你现在只能序列化属性在你想要的组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;美元obj=新MyObj ();美元obj- >foo =“foo”;美元obj- >setBar (“酒吧”);美元标准化者=新ObjectNormalizer (美元classMetadataFactory);美元序列化器=新序列化器([美元标准化者]);美元数据=美元序列化器- >正常化(美元obj,零,(“组织”= >“group1”]);/ / $ data = [“foo”= >“foo”);美元methoda=美元序列化器- >denormalize ([“foo”= >“foo”,“酒吧”= >“酒吧”),“MyObj”,零,(“组织”= > [“group1”,“group3”]]);/ / $ methoda = MyObj (foo:“foo”栏:“酒吧”)