序列化器组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
序列化器组件
序列化器组件是用来把对象变成一个特定格式(XML、JSON、YAML…)和其它的方法。
为了这样做,序列化器组件遵循以下简单的模式。
正如你所看到的在上面的图片中,一个数组之间的中间层使用对象和序列化的内容。这样,编码器将只处理特定的格式成数组反之亦然。同样,标准化者将处理特定的对象成数组反之亦然。
序列化是一个复杂的主题。这个组件可能无法覆盖所有你的用例的盒子,但它可能是有用的开发工具来进行序列化和反序列化对象。
安装
1
美元作曲家需要symfony /序列化ob娱乐下载器:^ 3.4
请注意
如果你安装这个组件之外的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
。
序列化一个对象
为了这个例子中,假定下面的类已经存在于您的项目:
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 52
名称空间应用程序\模型;类人{私人美元年龄;私人美元的名字;私人美元运动员;私人美元createdAt;/ /读取器公共函数getName(){返回美元这- >名称;}公共函数getAge(){返回美元这- >年龄;}公共函数getCreatedAt(){返回美元这- >createdAt;}/ /伊塞公共函数isSportsperson(){返回美元这- >纯真的;}/ / setter公共函数setName(美元的名字){美元这- >name =美元的名字;}公共函数setAge(美元年龄){美元这- >年龄=美元年龄;}公共函数setSportsperson(美元运动员){美元这- >纯真的=美元运动员;}公共函数setCreatedAt(美元createdAt){美元这- >createdAt =美元createdAt;}}
现在,如果你想要将这个对象序列化为JSON,您只需要使用序列化器服务之前创建:
1 2 3 4 5 6 7 8 9 10
美元人=新模型应用\ \人();美元人- >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”);
在这种情况下,反序列化()需要三个参数:
- 是解码的信息
- 这类的名称将解码的信息
- 使用的编码器将这些信息转化为一个数组
3.3
支持allow_extra_attributes
关键是在Symfony 3.3中引入的上下文中。ob娱乐下载
默认情况下,附加属性不映射到规范化的对象序列化器组件将被忽略。如果你喜欢抛出一个异常,当这一切发生的时候,设置allow_extra_attributes
上下文选项假
并提供一个对象实现ClassMetadataFactoryInterface
当构建标准化者:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
美元数据=< < < EOF foo <人> <名称> < /名称> <时代> 99 < /年龄> <城市> < /城市> < /人> EOF巴黎;/ /这将抛出一个Symfony \序列化ob娱乐下载器\ \组件异常\ ExtraAttributesException/ /因为“城市”不是一个Person类的属性美元classMetadataFactory=新ClassMetadataFactory (新AnnotationLoader (新AnnotationReader ()));美元标准化者=新ObjectNormalizer (美元classMetadataFactory);美元序列化器=新序列化器([美元标准化者]);美元人=美元序列化器- >反序列化(美元数据,“模型应用\ \人”,“xml”,(“allow_extra_attributes”= >假]);
反序列化在现有对象
序列化器也可以用来更新现有的对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /……美元人=新人();美元人- >setName (“酒吧”);美元人- >setAge (99年);美元人- >setSportsperson (真正的);美元数据=< < < EOF foo <人> <名称> < /名称> <时代> 69 < /年龄> < /人> EOF;美元序列化器- >反序列化(美元数据,人::类,“xml”,(“object_to_populate”= >美元人]);/ /美元=模型应用\ \人(名字:“foo”,年龄:69年,运动员:真正的)
这是一个常见的需要在处理一个ORM。
属性组
有时候,你想要序列化不同实体的属性。组织是实现这一目标需要一个方便的方法。
假设您有以下plain-old-PHP对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
名称空间Acme;类MyObj{公共美元喷火;私人美元酒吧;公共函数getBar(){返回美元这- >酒吧;}公共函数setBar(美元酒吧){返回美元这- >酒吧=美元酒吧;}}
可以使用注释指定序列化的定义,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.yml”));
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”栏:“酒吧”)
请注意
为了使用注释装载机,你应该安装了教义/注释
和教义/缓存
包与作曲家。
提示
注释的类不自动加载,所以你必须使用类加载器加载它们是这样的:
1 2 3 4 5 6 7 8 9
使用作曲家\自动装载\类加载器;使用学说\常见的\注释\AnnotationRegistry;/ * *@var类加载器加载程序* /美元美元加载程序=需要__DIR__。“/ . . /供应商/ autoload.php”;AnnotationRegistry::registerLoader ([美元加载程序,“loadClass”]);返回美元加载程序;
选择特定的属性
也可以序列化只有一组特定的属性:
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
使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;类用户{公共美元familyName;公共美元givenName;公共美元公司;}类公司{公共美元的名字;公共美元地址;}美元公司=新公司();美元公司- >name =“Les-Tilleuls.coop”;美元公司- >地址=法国里尔的;美元用户=新用户();美元用户- >familyName =“Dunglas”;美元用户- >givenName =“凯文”;美元用户- >公司=美元公司;美元序列化器=新序列化器([新ObjectNormalizer ()));美元数据=美元序列化器- >正常化(美元用户,零,(“属性”= > [“familyName”,“公司”= > [“名字”]]]);/ / $ data = [' familyName ' = > ' Dunglas ', '公司' = >['名字' = > ' Les-Tilleuls.coop ']);
只有属性不忽略(见下文)。如果一些序列化组织设置,只有属性允许可以使用这些组织。
至于团体,属性可以选择在序列化和反序列化过程。
忽略属性
请注意
使用属性组,而不是setIgnoredAttributes ()方法被认为是最佳实践。
作为一个选项,有一种无视属性从原点对象。删除那些属性使用setIgnoredAttributes ()方法标准化者定义:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;美元标准化者=新ObjectNormalizer ();美元标准化者- >setIgnoredAttributes ([“年龄”]);美元编码器=新JsonEncoder ();美元序列化器=新序列化器([美元标准化者]、[美元编码器]);美元序列化器- >序列化(美元人,json的);/ /输出:{“名称”:“foo”、“运动员”:假}
将属性名当序列化和反序列化
有时序列化属性必须命名不同属性或PHP类的getter / setter方法。
序列化器组件提供了一个方便的方法来翻译或PHP字段名称映射到序列化的名字:变频器系统的名称。
给你有以下对象:
1 2 3 4 5
类公司{公共美元的名字;公共美元地址;}
在序列化形式,必须前缀的所有属性org_
如下:
1
{“org_name”:“Acme公司。”,“org_address”:“123大街,大城市”}
自定义名字转换器可以处理这种情况下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\序列化器\NameConverter\NameConverterInterface;类OrgPrefixNameConverter实现了NameConverterInterface{公共函数正常化(美元propertyName){返回“org_”。美元propertyName;}公共函数denormalize(美元propertyName){/ /删除“org_”前缀返回“org_”= = = substr (美元propertyName,0,4)?substr (美元propertyName,4):美元propertyName;}}
自定义名字转换器可以通过使用它作为第二个参数的类扩展AbstractNormalizer,包括GetSetMethodNormalizer和PropertyNormalizer:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;美元nameConverter=新OrgPrefixNameConverter ();美元标准化者=新ObjectNormalizer (零,美元nameConverter);美元序列化器=新序列化器([美元标准化者]、[新JsonEncoder ()));美元公司=新公司();美元公司- >name =“Acme公司”。;美元公司- >地址=123大街,大城市的;美元json=美元序列化器- >序列化(美元公司,json的);/ / {“org_name”:“Acme公司。”,“org_address”:“123大街,大城市”}美元companyCopy=美元序列化器- >反序列化(美元json、公司::类,json的);/ /相同的数据作为美元的公司
CamelCase, snake_case
在许多格式,通常使用下划线分隔单词(也称为snake_case)。然而,在Symfony应ob娱乐下载用程序通常使用(即使CamelCase命名属性PSR-1标准不推荐任何特定的属性名称)。
ob娱乐下载Symfony提供了一个内置的名字转换器设计之间变换snake_case和CamelCased风格在序列化和反序列化过程:
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日
使用ob娱乐下载\组件\序列化器\NameConverter\CamelCaseToSnakeCaseNameConverter;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;美元标准化者=新ObjectNormalizer (零,新CamelCaseToSnakeCaseNameConverter ());类人{私人美元firstName;公共函数__construct(美元firstName){美元这- >firstName =美元firstName;}公共函数getFirstName(){返回美元这- >firstName;}}美元凯文=新人(“凯文”);美元标准化者- >正常化(美元凯文);/ / [' first_name ' = > '凯文'];美元安妮=美元标准化者- >denormalize ([“first_name”= >“安妮”),“人”);/ / firstName Person对象:“安妮”
序列化布尔属性
如果您使用的是伊塞方法(前缀的方法是
,就像模型应用\ \人::isSportsperson ()
),序列化器组件会自动检测和使用它来序列化相关属性。
的ObjectNormalizer
还负责方法入手有
,添加
和删除
。
使用回调函数来序列化属性与对象实例
序列化时,你可以设置一个回调格式特定对象属性:
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
使用应用程序\模型\人;使用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 "}
标准化者
有几种类型的标准化者可用:
- ObjectNormalizer
-
这个标准化者利用PropertyAccess组件读和写的对象。这意味着它可以直接访问属性和通过getter、setter, hassers,伊塞,蛇和消毒剂。它支持反规范化过程中调用构造函数。
对象是规范化的地图属性名称和值(名字是由删除生成的
得到
,集
,有
,是
,添加
orgydF4y2Ba删除
前缀的方法名称,把第一个字母小写;如。getFirstName ()
- >firstName
)。的
ObjectNormalizer
是最强大的标准化者。默认配置时使用Symfony的标准版的序列化器启用。ob娱乐下载 - GetSetMethodNormalizer
-
这类标准化者读取的内容通过调用“getter”(公共方法从“获得”)。应该将正规化数据通过调用构造函数和“setter”(公共方法从“设置”)。
对象是规范化的地图属性名称和值(名字是由删除生成的
得到
前缀的方法名称,把第一个字母小写;如。getFirstName ()
- >firstName
)。 - PropertyNormalizer
-
这种标准化者直接读写以及公共属性私有和保护两类和它的所有属性(父类)。它支持反规范化过程中调用构造函数。
对象是规范化的地图属性名称属性值。
3.4
处理父类的能力
PropertyNormalizer
是在Symfony 3.4中引入的。ob娱乐下载 - JsonSerializableNormalizer
-
这与类,实现标准化者工作JsonSerializable。
它将调用JsonSerializable: jsonSerialize ()方法,然后进一步正常化的结果。这意味着,嵌套JsonSerializable类也将归一化。
标准化者是特别有用,当你想要逐渐从现有代码库使用简单的迁移json_encode的Symfonob娱乐下载y序列化器允许您混合标准化者用于哪些类。
与json_encode可以处理循环引用。
- DateTimeNormalizer
-
这个标准化者转换DateTimeInterface对象(如。DateTime和DateTimeImmutable)字符串。默认情况下,它使用RFC3339格式。
3.2
支持指定datetime格式在介绍了反规范化
DateTimeNormalizer
在Syob娱乐下载mfony 3.2。 - DataUriNormalizer
-
这个标准化者转换SplFileInfo对象到一个数据URI字符串(
数据:……
),这样文件可以嵌入到序列化数据。 - DateIntervalNormalizer
-
这个标准化者转换DateInterval对象为字符串。默认情况下,它使用
P % dDT % % yY %毫米hH % iM %党卫军
格式。3.4
的
DateIntervalNormalizer
标准化者是在Symfony 3.4中引入的。ob娱乐下载
编码器
序列化器组件支持很多格式的:
- JsonEncoder
- 这类编码和解码数据JSON。
- XmlEncoder
- 这类编码和解码数据XML。
- YamlEncoder
- 这个编码器编码和解码数据YAML。这个编码器需要Yaml组件。
- CsvEncoder
- 这个编码器编码和解码数据CSV。
这些编码器都是默认启用当使用Symfony标准版的序列化器启用。ob娱乐下载
3.2
的YamlEncoder
和CsvEncoder
编码器在Symfony 3.2中引入的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(){返回美元这- >组织;}}
为了避免无限循环,GetSetMethodNormalizerorgydF4y2BaObjectNormalizer扔一个CircularReferenceException当遇到这种情况:
1 2 3 4 5 6 7 8 9 10
美元成员=新成员();美元成员- >setName (“凯文”);美元组织=新组织();美元组织- >setName (“Les-Tilleuls.coop”);美元组织- >setMembers ([美元成员]);美元成员- >setOrganization (美元组织);回声美元序列化器- >序列化(美元组织,json的);/ /抛出CircularReferenceException
的setCircularReferenceLimit ()
方法的标准化者设置的次数将序列化相同的对象在考虑前一个循环引用。它的默认值是1
。
而不是抛出异常,循环引用也可以由自定义可调用的。这是特别有用,当序列化实体拥有独特的标识符:
1 2 3 4 5 6 7 8 9 10
美元编码器=新JsonEncoder ();美元标准化者=新ObjectNormalizer ();美元标准化者- >setCircularReferenceHandler (函数(美元对象){返回美元对象- >getName ();});美元序列化器=新序列化器([美元标准化者]、[美元编码器]);var_dump (美元序列化器- >序列化(美元org,json的));/ / {" name ": " Les-Tilleuls。鸡笼”、“成员”:[{“名称”:“K \ u00e9vin”,组织:“Les-Tilleuls.coop”}]}
处理序列化深度
序列化器组件能够检测和限制序列化深度。它序列化大树时尤其有用。假设以下数据结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
名称空间Acme;类MyObj{公共美元喷火;/ * * *@var自我* /公共美元孩子;}美元使有效=新MyObj ();美元使有效- >foo =“使”;美元二级=新MyObj ();美元二级- >foo =“二级”;美元使有效- >孩子=美元二级;美元level3=新MyObj ();美元level3- >foo =level3的;美元二级- >孩子=美元level3;
设置一个最大深度的序列化器可以配置对于一个给定的属性。在这里,我们将它设置为2美元的孩子
属性:
- 注释
- YAML
- XML
1 2 3 4 5 6 7 8 9 10 11 12 13
名称空间Acme;使用ob娱乐下载\组件\序列化器\注释\MaxDepth;类MyObj{/ * * *@MaxDepth(2)* /公共美元孩子;/ /……}
相对应的元数据加载器选择格式必须配置以使用此功能。它是使用Symfony的标准版时自动完成。ob娱乐下载当使用独立的组件,请参阅组的文档欧宝官网下载app学习如何做到这一点。
检查只是如果enable_max_depth
关键的序列化器上下文设置真正的
。在下面的例子中,第三层次不是序列化的,因为它是比2的配置的最大深度:
1 2 3 4 5 6 7 8 9 10 11 12
美元结果=美元序列化器- >正常化(美元使有效,零,(“enable_max_depth”= >真正的]);/ * $ =结果[“foo”= >“使”,“孩子”= > [“foo”= >“二级”、“孩子”= > '孩子' = >零,,),);* /
处理数组
对象的序列化器组件能够处理数组。工作就像序列化一个对象序列化数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用Acme\人;美元person1=新人();美元person1- >setName (“foo”);美元person1- >setAge (99年);美元person1- >setSportsman (假);美元person2=新人();美元person2- >setName (“酒吧”);美元person2- >setAge (33);美元person2- >setSportsman (真正的);美元人= (美元person1,美元person2];美元数据=美元序列化器- >序列化(美元人,json的);/ /数据包含美元[{“名称”:“foo”,“年龄”:99年,“运动员”:假},{“名称”:“酒吧”,“年龄”:33岁的“运动员”:真正}]
如果你想反序列化这样的结构,你需要添加ArrayDenormalizer标准化者的集合。通过添加[]
的类型参数反序列化()方法,你表明你期望一个数组而不是一个对象:
1 2 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\标准化者\ArrayDenormalizer;使用ob娱乐下载\组件\序列化器\标准化者\GetSetMethodNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;美元序列化器=新序列化器([新GetSetMethodNormalizer (),新ArrayDenormalizer ()]、[新JsonEncoder ()));美元数据=……;/ /序列化数据前面的示例美元人=美元序列化器- >反序列化(美元数据,“Acme \[]的人”,json的);
的XmlEncoder
这个编码器将数组转换为XML,反之亦然。例如,把一个对象规范如下:
1
(“foo”= > [1,2),“酒吧”= >真正的];
的XmlEncoder
编码该对象如下:
1 2 3 4 5 6
< ?xml version = " 1.0 " ? ><响应><喷火>1< /喷火><喷火>2< /喷火><酒吧>1< /酒吧>< /响应>
数组键开始@
被认为是XML属性:
1 2 3 4 5 6 7
(“foo”= > [“@bar”= >“价值”]];/ /编码如下:/ /< ?xml version = " 1.0 "? >/ / <反应>/ / < foo酒吧= " value " / >/ / < /响应>
使用特殊的#
定义关键节点的数据:
1 2 3 4 5 6 7
(“foo”= > [“@bar”= >“价值”,“#”= >“记者”]];/ /编码如下:/ /< ?xml version = " 1.0 "? >/ / <反应>/ / < foo酒吧=“价值”>巴兹< / foo >/ / < /响应>
上下文
的编码()
方法定义了第三个可选参数上下文
它定义了配置选项XmlEncoder关联数组:
1
美元xmlEncoder- >编码(美元数组,“xml”,美元上下文);
这些选项:
-
xml_format_output
- 如果设置为真,格式生成的XML换行和缩进。
-
xml_version
-
设置XML版本属性(默认值:
1.1
)。 -
xml_encoding
-
设置XML编码属性(默认值:
utf - 8
)。 -
xml_standalone
-
在生成的XML添加独立的属性(默认值:
真正的
)。 -
xml_root_node_name
-
设置根节点名称(默认值:
响应
)。 -
remove_empty_tags
- 如果设置为真,删除所有空标签生成的XML。
递归反规范化和类型安全
可以使用的序列化器组件PropertyInfo组件应该向正规化复杂类型(对象)。类的属性的类型会猜到应该使用提供器和用于递归地正规化的内部数据。
当使用Symfony标准版,所ob娱乐下载有标准化者都是自动配置为使用注册提取器。当使用组件独立的实现PropertyTypeExtractorInterface(通常的一个实例PropertyInfoExtractor)必须作为第四的参数传递ObjectNormalizer
:
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
名称空间Acme;使用ob娱乐下载\组件\PropertyInfo\器\ReflectionExtractor;使用ob娱乐下载\组件\序列化器\标准化者\DateTimeNormalizer;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;类ObjectOuter{私人美元内心的;私人美元日期;公共函数捷信(){返回美元这- >内心的;}公共函数装入的(ObjectInner美元内心的){美元这- >内心的=美元内心的;}公共函数设置当前日期(\ DateTimeInterface美元日期){美元这- >日期=美元日期;}公共函数获取当前日期(){返回美元这- >日期;}}类ObjectInner{公共美元喷火;公共美元酒吧;}美元标准化者=新ObjectNormalizer (零,零,零,新ReflectionExtractor ());美元序列化器=新序列化器([新DateTimeNormalizer (),美元标准化者]);美元obj=美元序列化器- >denormalize ([“内心”= > [“foo”= >“foo”,“酒吧”= >“酒吧”),“日期”= >“1988/01/21”),“Acme \ ObjectOuter”);转储(美元obj- >捷信()- >foo);/ /“foo”转储(美元obj- >捷信()- >栏);/ / '酒吧'转储(美元obj- >获取当前日期()- >格式(“Y-m-d”));/ /“1988-01-21”
当一个PropertyTypeExtractor
可用,应该标准化者还将检查数据正规化匹配属性的类型(即使是原始类型)。例如,如果一个字符串
提供,但属性的类型是什么int
,一个UnexpectedValueException将抛出。执行类型的属性可以通过设置序列化器上下文选项被禁用ObjectNormalizer: DISABLE_TYPE_ENFORCEMENT
来真正的
。