序列化器组件

编辑该页面

使用序列化器组件,设置序列化器指定编码器和标准化者可用:

1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\序列化器\编码器\JsonEncoder;使用欧宝娱乐app下载地址\组件\序列化器\编码器\XmlEncoder;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元编码器= (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”);

在这种情况下,反序列化()需要三个参数:

  1. 是解码的信息
  2. 这类的名称将解码的信息
  3. 使用的编码器将这些信息转化为一个数组

默认情况下,附加属性不映射到规范化的对象序列化器组件将被忽略。如果你喜欢抛出一个异常,当这一切发生的时候,设置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 \序列化欧宝娱乐app下载地址器\ \组件异常\ 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只适用于单一的子对象,而不是对象的数组。这些仍将取代现在的规范化数据。

可以使用注释指定序列化的定义,XML或YAML。的ClassMetadataFactory将使用的标准化者必须意识到要使用的格式。

下面的代码显示了如何初始化ClassMetadataFactory为每个格式:

  • 在PHP文件注释:

    1 2 3 4 5
    使用学说\常见的\注释\AnnotationReader;使用欧宝娱乐app下载地址\组件\序列化器\映射\工厂\ClassMetadataFactory;使用欧宝娱乐app下载地址\组件\序列化器\映射\加载程序\AnnotationLoader;美元classMetadataFactory=ClassMetadataFactory (AnnotationLoader (AnnotationReader ()));
  • YAML文件:

    1 2 3 4
    使用欧宝娱乐app下载地址\组件\序列化器\映射\工厂\ClassMetadataFactory;使用欧宝娱乐app下载地址\组件\序列化器\映射\加载程序\YamlFileLoader;美元classMetadataFactory=ClassMetadataFactory (YamlFileLoader (“/道路/ /你/ definition.yaml”));
  • XML文件:

    1 2 3 4
    使用欧宝娱乐app下载地址\组件\序列化器\映射\工厂\ClassMetadataFactory;使用欧宝娱乐app下载地址\组件\序列化器\映射\加载程序\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
名称空间Acme;使用欧宝娱乐app下载地址\组件\序列化器\注释\;MyObj{#(组([' group1 ', ' group2 ']))公共美元喷火;#(团体([' group4 ']))公共美元anotherProperty;#(团体([' group3 ']))公共函数getBar()/ /*方法支持{返回美元- >酒吧;}/ /……}

你现在只能序列化属性在你想要的组:

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
使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元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”]]);/ / $ methoda = MyObj (foo:“foo”栏:“酒吧”)/ /得到所有组,使用特殊的价值‘*’‘组织’美元obj3=美元序列化器- >denormalize ([“foo”= >“foo”,“anotherProperty”= >“anotherProperty”,“酒吧”= >“酒吧”),“MyObj”,,(“组织”= > [‘*’]]);/ / $ methoda = MyObj (foo:“foo”, anotherProperty:“anotherProperty”栏:“酒吧”)

只有属性不忽略(见下文)。如果一些序列化组织设置,只有属性允许可以使用这些组织。

至于团体,属性可以选择在序列化和反序列化过程。

@ ignore注释

  • 属性
  • YAML
  • XML
1 2 3 4 5 6 7 8 9 10 11
名称空间应用程序\模型;使用欧宝娱乐app下载地址\组件\序列化器\注释\忽略;MyClass{公共美元喷火;#【忽略】公共美元酒吧;}

你现在可以忽略特定属性在序列化:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用应用程序\模型\MyClass;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元obj=MyClass ();美元obj- >foo =“foo”;美元obj- >酒吧=“酒吧”;美元标准化者=ObjectNormalizer (美元classMetadataFactory);美元序列化器=序列化器([美元标准化者]);美元数据=美元序列化器- >正常化(美元obj);/ / $ data = [“foo”= >“foo”);

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
使用欧宝娱乐app下载地址\组件\序列化器\NameConverter\NameConverterInterface;OrgPrefixNameConverter实现了NameConverterInterface{公共函数正常化(字符串美元propertyName):字符串{返回“org_”美元propertyName;}公共函数denormalize(字符串美元propertyName):字符串{/ /删除“org_”前缀返回“org_”= = = substr (美元propertyName,0,4)?substr (美元propertyName,4):美元propertyName;}}

自定义名字转换器可以通过使用它作为第二个参数的类扩展AbstractNormalizer,包括GetSetMethodNormalizerPropertyNormalizer:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用欧宝娱乐app下载地址\组件\序列化器\编码器\JsonEncoder;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元nameConverter=OrgPrefixNameConverter ();美元标准化者=ObjectNormalizer (,美元nameConverter);美元序列化器=序列化器([美元标准化者]、[JsonEncoder ()));美元公司=公司();美元公司- >name =“Acme公司”。;美元公司- >地址=123大街,大城市的;美元json=美元序列化器- >序列化(美元公司,json的);/ / {“org_name”:“Acme公司。”,“org_address”:“123大街,大城市”}美元companyCopy=美元序列化器- >反序列化(美元json、公司::类,json的);/ /相同的数据作为美元的公司

请注意

你也可以实现AdvancedNameConverterInterface访问当前类名,格式和上下文。

PSR-1标准不推荐任何特定的属性名称)。

欧宝娱乐app下载地址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日
使用欧宝娱乐app下载地址\组件\序列化器\NameConverter\CamelCaseToSnakeCaseNameConverter;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;美元标准化者=ObjectNormalizer (,CamelCaseToSnakeCaseNameConverter ());{私人美元firstName;公共函数__construct(美元firstName){美元- >firstName =美元firstName;}公共函数getFirstName(){返回美元- >firstName;}}美元凯文=人(“凯文”);美元标准化者- >正常化(美元凯文);/ / [' first_name ' = > '凯文'];美元安妮=美元标准化者- >denormalize ([“first_name”= >“安妮”),“人”);/ / firstName Person对象:“安妮”

属性组部分,这已经是建立和你只需要提供配置。否则:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /……使用欧宝娱乐app下载地址\组件\序列化器\编码器\JsonEncoder;使用欧宝娱乐app下载地址\组件\序列化器\NameConverter\MetadataAwareNameConverter;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元classMetadataFactory=ClassMetadataFactory (AnnotationLoader (AnnotationReader ()));美元metadataAwareNameConverter=MetadataAwareNameConverter (美元classMetadataFactory);美元序列化器=序列化器([ObjectNormalizer (美元classMetadataFactory,美元metadataAwareNameConverter)]、[json的= >JsonEncoder ()));

现在配置你的名字转换映射。考虑一个应用程序,该应用程序定义了一个实体与一个firstName属性:

  • 属性
  • YAML
  • XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
名称空间应用程序\实体;使用欧宝娱乐app下载地址\组件\序列化器\注释\SerializedName;{# (SerializedName (customer_name)]私人美元firstName;公共函数__construct(美元firstName){美元- >firstName =美元firstName;}/ /……}

使用这个自定义映射对象进行序列化和反序列化时将属性名:

1 2
美元序列化=美元序列化器- >序列化(人(“凯文”),json的);/ / {“customer_name”:“凯文”}

是,就像模型应用\ \人::isSportsperson ()),序列化器组件会自动检测和使用它来序列化相关属性。

ObjectNormalizer还负责方法入手,得到,可以

6.1

装罐头的支持(前缀的方法可以)是在Symfony 6.1中引入的。欧宝娱乐app下载地址

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
使用应用程序\模型\;使用欧宝娱乐app下载地址\组件\序列化器\编码器\JsonEncoder;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\GetSetMethodNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元编码器=JsonEncoder ();/ /所有回调参数是可选的(你可以忽略那些你不使用)美元dateCallback=函数(美元innerObject,美元outerObject、字符串美元attributeName、字符串美元格式= null,数组美元上下文= []){返回美元innerObject运算符\ DateTime吗?美元innerObject- >(\ DateTime格式::ISO8601):;};美元defaultContext= [AbstractNormalizer::回调函数= > [“createdAt”= >美元dateCallback]];美元标准化者=GetSetMethodNormalizer (,,,,,美元defaultContext);美元序列化器=序列化器([美元标准化者]、[美元编码器]);美元=人();美元- >setName (“cordoval”);美元- >setAge (34);美元- >setCreatedAt (\ DateTime (“现在”));美元序列化器- >序列化(美元,json的);/ /输出:{“名称”:“cordoval”,“年龄”:34岁“createdAt”:“2014 - 03 - 22 - t09:43:12 - 0500 "}

NormalizerInterface为(对象数组)和正常化DenormalizerInterfacedenormalizing(数组对象)。

标准化者被启用的序列化器作为其第一个参数传递:

1 2 3 4 5
使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元标准化者= (ObjectNormalizer ()];美元序列化器=序列化器(美元标准化者[]);

ObjectNormalizer

这个标准化者利用PropertyAccess组件读和写的对象。这意味着它可以直接访问属性和通过getter、setter, hassers,伊塞,装罐头,蛇和消毒剂。它支持反规范化过程中调用构造函数。

对象是规范化的地图属性名称和值(名字是由删除生成的得到,,,,可以,添加orgydF4y2Ba删除前缀的方法名称,把第一个字母小写;如。getFirstName ()- >firstName)。

ObjectNormalizer是最强大的标准化者。在Symfony应用程序默认配置与序列化器组件启用。欧宝娱乐app下载地址

GetSetMethodNormalizer

这类标准化者读取的内容通过调用“getter”(公共方法从“获得”)。应该将正规化数据通过调用构造函数和“setter”(公共方法从“设置”)。

对象是规范化的地图属性名称和值(名字是由删除生成的得到前缀的方法名称,把第一个字母小写;如。getFirstName ()- >firstName)。

PropertyNormalizer

这种标准化者直接读写以及公共属性私有和保护两类和它的所有属性(父类)通过使用PHP反射。它支持反规范化过程中调用构造函数。

对象是规范化的地图属性名称属性值。

如果你只喜欢正常化某些属性(例如,只有公共属性)设置PropertyNormalizer: NORMALIZE_VISIBILITY上下文选项并结合下列值:PropertyNormalizer: NORMALIZE_PUBLIC,PropertyNormalizer: NORMALIZE_PROTECTEDorgydF4y2BaPropertyNormalizer: NORMALIZE_PRIVATE

6.2

PropertyNormalizer: NORMALIZE_VISIBILITY上下文选项及其价值观在Symfony 6.2中引入的。欧宝娱乐app下载地址

JsonSerializableNormalizer

这与类,实现标准化者工作JsonSerializable

它将调用JsonSerializable: jsonSerialize ()方法,然后进一步正常化的结果。这意味着,嵌套JsonSerializable类也将归一化。

标准化者是特别有用,当你想要逐渐从现有代码库使用简单的迁移json_encode的Symfon欧宝娱乐app下载地址y序列化器允许您混合标准化者用于哪些类。

json_encode可以处理循环引用。

DateTimeNormalizer
这个标准化者转换DateTimeInterface对象(如。DateTimeDateTimeImmutable)字符串。默认情况下,它使用RFC3339格式。
DateTimeZoneNormalizer
这个标准化者转换DateTimeZone时区对象为代表的名称字符串,时区显示PHP时区列表
DataUriNormalizer
这个标准化者转换SplFileInfo成一个对象数据URI字符串(数据:……),这样文件可以嵌入到序列化数据。
DateIntervalNormalizer
这个标准化者转换DateInterval对象为字符串。默认情况下,它使用P % dDT % % yY %毫米hH % iM %党卫军格式。
BackedEnumNormalizer
这种标准化者将BackedEnum对象转换为字符串或整数。
FormErrorNormalizer

这与类,实现标准化者工作FormInterface

它将得到错误的形式和规范化成规范化的数组。

ConstraintViolationListNormalizer
这个标准化者转换实现的对象ConstraintViolationListInterface到一个显示错误列表RFC 7807标准。
ProblemNormalizer
纠正错误按照API规范问题RFC 7807
CustomNormalizer
使一个PHP对象使用一个对象,实现了规范化NormalizableInterface
UidNormalizer

这个标准化者转换实现的对象AbstractUid为字符串。默认的标准化格式实现的对象UuidRFC 4122格式(例如:d9e7a184 - 5 - d5b - 11 - ea - a62a d0——3499710062)。默认的标准化格式实现的对象Ulid是基本32格式(例如:01 e439tp9xjz9rpfh3t1pybcr8)。你可以改变设置序列化器上下文选项的字符串格式UidNormalizer: NORMALIZATION_FORMAT_KEYUidNormalizer: NORMALIZATION_FORMAT_BASE_58,UidNormalizer: NORMALIZATION_FORMAT_BASE_32orgydF4y2BaUidNormalizer: NORMALIZATION_FORMAT_RFC_4122

应该也能正规化uuidorgydF4y2Baulid字符串UuidorgydF4y2BaUlid。格式不重要。

请注意

您还可以创建自己的标准化者使用另一个结构。阅读更多如何创建自定义标准化者

某些标准化者默认启用使用序列化器组件在Symfony应用程序时,可以启用额外的标记他们欧宝娱乐app下载地址serializer.normalizer

这里是如何启用内置的一个例子GetSetMethodNormalizer,更快的选择ObjectNormalizer:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……get_set_method_normalizer:类:欧宝娱乐app下载地址Symfony \组件\ \标准化者\ GetSetMethodNormalizer进行序列化标签:(serializer.normalizer)

EncoderInterface对编码格式(数组)和DecoderInterface解码(格式数组)。

您可以添加新的编码器序列化器实例通过使用它的第二个构造函数参数:

1 2 3 4 5 6
使用欧宝娱乐app下载地址\组件\序列化器\编码器\JsonEncoder;使用欧宝娱乐app下载地址\组件\序列化器\编码器\XmlEncoder;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元编码器= (XmlEncoder (),JsonEncoder ()];美元序列化器=序列化器([],美元编码器);

JsonEncoder
这类编码和解码数据JSON
XmlEncoder
这类编码和解码数据XML
YamlEncoder
这个编码器编码和解码数据YAML。这个编码器需要Yaml组件
CsvEncoder
这个编码器编码和解码数据CSV

请注意

您还可以创建自己的编码器使用另一个结构。阅读更多如何创建自定义编码器吗

这些编码器都是默认启用当使用序列化器组件在Symfony应用程序。欧宝娱乐app下载地址

JsonEncoder

JsonEncoder编码和解码的JSON字符串,基于PHPjson_encodejson_decode功能。它可以是有用的来修改这些功能如何操作在某些情况下通过提供选项等JSON_PRESERVE_ZERO_FRACTION。您可以使用这些选项中的序列化上下文通过使用的关键json_encode_optionsorgydF4y2Bajson_decode_options分别为:

1
美元- >序列化器- >序列化(美元数据,json的,(“json_encode_options”= > \ JSON_PRESERVE_ZERO_FRACTION]);

CsvEncoder

CsvEncoder编码和解码从CSV。

CsvEncoder上下文选项

编码()方法定义了第三个可选参数上下文它定义了配置选项CsvEncoder关联数组:

1
美元csvEncoder- >编码(美元数组,“csv”,美元上下文);

这些选项:

选项 描述 默认的
csv_delimiter 设置字段分隔符分隔值(仅一个字符) ,
csv_enclosure 设置字段外壳(一个字符)
csv_end_of_line 设置字符(s)用来标记CSV文件中的每一行的结束 \ n
csv_escape_char 设置转义字符(一个字符) 空字符串
csv_key_separator 设置分隔符数组的键在压扁
csv_headers 套头的顺序和数据列如:如果$ data = [' c ' = > 3, ' ' = > 1, b = > 2)$选项= [' csv_headers ' = > [' a ', ' b ', ' c ']]然后序列化($ data, csv,美元选项)返回a, b, c \ n1 2 3 [],推断出从输入数据的键
csv_escape_formulas 通过将他们逃字段包含公式\ t字符
as_collection 总是返回结果集,即使只有一行解码。 真正的
no_headers 禁用头的编码CSV
output_utf8_bom 输出的特殊utf - 8 BOM随着编码的数据

XmlEncoder

这个编码器将数组转换为XML,反之亦然。

例如,把一个对象规范如下:

1
(“foo”= > [1,2),“酒吧”= >真正的];

XmlEncoder将这样的编码这个对象:

1 2 3 4 5 6
< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><响应><喷火>1< /喷火><喷火>2< /喷火><酒吧>1< /酒吧>< /响应>

特殊的#主要可用于定义一个节点的数据:

1 2 3 4 5 6 7 8 9
(“foo”= > [“@bar”= >“价值”,“#”= >“记者”]];/ /编码如下:/ /< ?xml version = " 1.0 "? >/ / <反应>/ / < foo酒吧=“价值”>/ /巴兹/ / < / foo >/ / < /响应>

此外,键开始@将属性和关键#评论可用于编码XML注释:

1 2 3 4 5 6 7 8 9 10 11
美元编码器=XmlEncoder ();美元编码器- >编码([“foo”= > [“@bar”= >“价值”),“qux”= > [“#评论”= >“评论”),),“xml”);/ /返回:/ /< ?xml version = " 1.0 "? >/ / <反应>/ / < foo酒吧= " value " / >/ / < qux > < !——评论! > < qux >/ / < /响应>

您可以通过上下文关键as_collection为了让结果总是作为一个集合。

提示

XML注释解码时默认是忽略的内容,但这种行为与可选的上下文可以改变关键XmlEncoder: DECODER_IGNORED_NODE_TYPES

数据与#评论默认密钥编码XML注释。这可以通过添加改变了\ XML_COMMENT_NODE可以选择的XmlEncoder: ENCODER_IGNORED_NODE_TYPES关键的defaultContext美元XmlEncoder构造函数或直接美元的上下文论点的编码()方法:

1
美元xmlEncoder- >编码(美元数组,“xml”,(XmlEncoder::ENCODER_IGNORED_NODE_TYPES = > [\ XML_COMMENT_NODE]]);

XmlEncoder上下文选项

编码()方法定义了第三个可选参数上下文它定义了配置选项XmlEncoder关联数组:

1
美元xmlEncoder- >编码(美元数组,“xml”,美元上下文);

这些选项:

选项 描述 默认的
xml_format_output 如果设置为真,格式生成的XML换行和缩进
xml_version 设置XML版本属性 1.1
xml_encoding XML编码属性集 utf - 8
xml_standalone 添加独立的属性在生成的XML 真正的
xml_type_cast_attributes 这提供了忘记属性类型铸件的能力 真正的
xml_root_node_name 设置根节点的名称 响应
as_collection 总是返回结果集,即使只有一行解码
decoder_ignored_node_types 节点类型的数组(DOM XML_ *常量)解码时被忽略 [\ XML_PI_NODE \ XML_COMMENT_NODE]
encoder_ignored_node_types 节点类型的数组(DOM XML_ *常量)被忽略,而编码 []
load_options XML加载选择与libxml \ LIBXML_NONET | \ LIBXML_NOBLANKS
remove_empty_tags 如果设置为真,删除所有空标签生成的XML

例子中使用自定义上下文:

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
使用欧宝娱乐app下载地址\组件\序列化器\编码器\XmlEncoder;/ /新建编码器与指定的选项默认设置美元xmlEncoder=XmlEncoder ([“xml_format_output”= >真正的]);美元数据= (“id”= >“IDHNQIItNyQ”,“日期”= >“2019-10-24”,);/ /编码使用默认上下文美元xmlEncoder- >编码(美元数据,“xml”);/ /输出:/ /< ?xml version = " 1.0 "? >/ / <反应>/ / < id > IDHNQIItNyQ < / id >/ / <日期> 2019-10-24 < /日期>/ / < /响应>/ /编码和修改上下文美元xmlEncoder- >编码(美元数据,“xml”,(“xml_root_node_name”= >“跟踪”,“encoder_ignored_node_types”= > [\ XML_PI_NODE,/ /删除XML声明(领先的XML标签))));/ /输出:/ / <道>/ / < id > IDHNQIItNyQ < / id >/ / <日期> 2019-10-24 < /日期>/ / < /跟踪>

YamlEncoder

这个编码器需要Yaml组件和转换从Yaml。

YamlEncoder上下文选项

编码()方法,像其他编码器,用途上下文设置配置选项YamlEncoder关联数组:

1
美元yamlEncoder- >编码(美元数组,yaml的,美元上下文);

这些选项:

选项 描述 默认的
yaml_inline 你切换到内联YAML的水平 0
yaml_indent 的缩进级别(内部使用) 0
yaml_flags 有些领域的Yaml: DUMP_ */PARSE_ *常量来定制编码/解码YAML字符串 0

序列化上下文,您可以使用“上下文建设者”定义上下文中使用连贯接口:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址\组件\序列化器\上下文\编码器\CsvEncoderContextBuilder;使用欧宝娱乐app下载地址\组件\序列化器\上下文\标准化者\ObjectNormalizerContextBuilder;美元initialContext= (“custom_key”= >“custom_value”,);美元contextBuilder= (ObjectNormalizerContextBuilder ())- >withContext (美元initialContext)- >withGroups ([“group1”,“group2”]);美元contextBuilder= (CsvEncoderContextBuilder ())- >withContext (美元contextBuilder)- >withDelimiter (“;”);美元序列化器- >序列化(美元的东西,“csv”,美元contextBuilder- >toArray ());

6.1

上下文建筑商在Symfony 6.1中引入的。欧宝娱乐app下载地址

请注意

序列化器组件提供了一个上下文建设者标准化者编码器

你也可以创建自定义上下文建筑商处理你的背景值。

零值

默认情况下,包含序列化器将保留属性价值。通过设置你可以改变这一行为AbstractObjectNormalizer: SKIP_NULL_VALUES上下文选项真正的:

1 2 3 4 5 6 7 8
美元={公共美元喷火;公共美元酒吧=“notNull”;};美元标准化者=ObjectNormalizer ();美元结果=美元标准化者- >正常化(美元,json的,(AbstractObjectNormalizer::SKIP_NULL_VALUES = >真正的]);/ /['酒吧' = > ' notNull ']

未初始化这不同于默认状态无类型的属性。当你试图访问一个类型的财产给了它一个显式的值之前,你得到一个错误。

为了避免序列化器抛出的错误当序列化或正常化和未初始化的对象属性,默认情况下,对象标准化者捕获这些错误并忽略这些属性。

你可以通过设置禁用这个行为AbstractObjectNormalizer: SKIP_UNINITIALIZED_VALUES上下文选项:

1 2 3 4 5 6 7 8
{公共字符串美元喷火=“初始化”;公共字符串美元酒吧;/ /未初始化}美元标准化者=ObjectNormalizer ();美元结果=美元标准化者- >正常化(假(),json的,(AbstractObjectNormalizer::SKIP_UNINITIALIZED_VALUES = >]);/ /抛出Symfo欧宝娱乐app下载地址ny \ PropertyAccess \ \组件异常\ UninitializedPropertyException标准化者不能读未初始化的属性

请注意

调用PropertyNormalizer:规范化orgydF4y2BaGetSetMethodNormalizer:规范化AbstractObjectNormalizer: SKIP_UNINITIALIZED_VALUES上下文选项设置为会抛出\错误实例如果给定对象未初始化的属性作为标准化者不能阅读(直接或通过getter /伊塞方法)。

COLLECT_DENORMALIZATION_ERRORS选项来收集所有的异常,且得到对象部分规范化:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
试一试{美元dto=美元序列化器- >反序列化(美元请求- >getContent (), MyDto::类,json的,(DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS = >真正的]);}(PartialDenormalizationException美元e){美元违反=ConstraintViolationList ();/ * *@var美元NotNormalizableValueException异常* /foreach(美元e- >getErrors ()作为美元异常){美元消息= sprintf (的类型必须是一个“% s”(“% s”)。”内爆(”、“,美元异常- >getExpectedTypes ()),美元异常- >getCurrentType ());美元参数= [];如果(美元异常- >canUseMessageForUser ()) {美元参数(“提示”]=美元异常- >getMessage ();}美元违反- >add (ConstraintViolation (美元消息,,美元参数,,美元异常- >getPath (),));}返回美元- >json (美元违反,400年);}

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

的关键circular_reference_limit在默认情况下设置的次数将序列化相同的对象在考虑前一个循环引用。默认值是1

而不是抛出异常,循环引用也可以由自定义可调用的。这是特别有用,当序列化实体拥有独特的标识符:

1 2 3 4 5 6 7 8 9 10 11
美元编码器=JsonEncoder ();美元defaultContext= [AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER = >函数(美元对象,美元格式,美元上下文){返回美元对象- >getName ();});美元标准化者=ObjectNormalizer (,,,,,,美元defaultContext);美元序列化器=序列化器([美元标准化者]、[美元编码器]);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美元的孩子属性:

1 2 3 4 5 6 7 8 9 10 11
名称空间Acme;使用欧宝娱乐app下载地址\组件\序列化器\注释\MaxDepth;MyObj{#【MaxDepth (2)】公共美元孩子;/ /……}

相对应的元数据加载器选择格式必须配置以使用此功能。它是自动完成当使用序列化器组件在Symfony应用程序。欧宝娱乐app下载地址当使用独立的组件,请参阅组的文档欧宝体育电话学习如何做到这一点。

检查只是如果AbstractObjectNormalizer: ENABLE_MAX_DEPTH关键的序列化器上下文设置真正的。在下面的例子中,第三层次不是序列化的,因为它是比2的配置的最大深度:

1 2 3 4 5 6 7 8 9 10 11 12
美元结果=美元序列化器- >正常化(美元使有效,,(AbstractObjectNormalizer::ENABLE_MAX_DEPTH = >真正的]);/ * $ =结果[“foo”= >“使”,“孩子”= > [“foo”= >“二级”、“孩子”= > '孩子' = >零,,),);* /

而不是抛出异常,可以当执行一个定制的可调用的最大深度。这是特别有用,当序列化实体拥有独特的标识符:

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
使用学说\常见的\注释\AnnotationReader;使用欧宝娱乐app下载地址\组件\序列化器\注释\MaxDepth;使用欧宝娱乐app下载地址\组件\序列化器\映射\工厂\ClassMetadataFactory;使用欧宝娱乐app下载地址\组件\序列化器\映射\加载程序\AnnotationLoader;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\AbstractObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;喷火{公共美元id;# (MaxDepth (1))公共美元孩子;}美元使有效=Foo ();美元使有效- >id =1;美元二级=Foo ();美元二级- >id =2;美元使有效- >孩子=美元二级;美元level3=Foo ();美元level3- >id =3;美元二级- >孩子=美元level3;美元classMetadataFactory=ClassMetadataFactory (AnnotationLoader (AnnotationReader ()));/ /所有回调参数是可选的(你可以忽略那些你不使用)美元maxDepthHandler=函数(美元innerObject,美元outerObject、字符串美元attributeName、字符串美元格式= null,数组美元上下文= []){返回“/ foo /”美元innerObject- >id;};美元defaultContext= [AbstractObjectNormalizer::MAX_DEPTH_HANDLER = >美元maxDepthHandler,);美元标准化者=ObjectNormalizer (美元classMetadataFactory,,,,,,美元defaultContext);美元序列化器=序列化器([美元标准化者]);美元结果=美元序列化器- >正常化(美元使有效,,(AbstractObjectNormalizer::ENABLE_MAX_DEPTH = >真正的]);/ * $ =结果[id = > 1,“孩子”= > [id = > 2, '孩子' = > ' / foo / 3 ',),);* /

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
使用欧宝娱乐app下载地址\组件\序列化器\编码器\JsonEncoder;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ArrayDenormalizer;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\GetSetMethodNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元序列化器=序列化器([GetSetMethodNormalizer (),ArrayDenormalizer ()]、[JsonEncoder ()));美元数据=……;/ /序列化数据前面的示例美元=美元序列化器- >反序列化(美元数据,“Acme \[]的人”,json的);

值对象,序列化器将无法创建对象如果一些参数是失踪。在这种情况下,使用default_constructor_arguments上下文选项:

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
使用欧宝娱乐app下载地址\组件\序列化器\标准化者\AbstractNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;MyObj{私人美元喷火;私人美元酒吧;公共函数__construct(美元喷火,美元酒吧){美元- >foo =美元喷火;美元- >酒吧=美元酒吧;}}美元标准化者=ObjectNormalizer (美元classMetadataFactory);美元序列化器=序列化器([美元标准化者]);美元数据=美元序列化器- >denormalize ([“foo”= >“你好”),“MyObj”,,(AbstractNormalizer::DEFAULT_CONSTRUCTOR_ARGUMENTS = > [“MyObj”= > [“foo”= >,“酒吧”= >]]]);/ / $ data = new MyObj(‘你好’,”);

PropertyInfo组件应该向正规化复杂类型(对象)。类的属性的类型会猜到应该使用提供器和用于递归地正规化的内部数据。

当使用该组件在Symfony应用程序中,所有标准化者会自动配置欧宝娱乐app下载地址为使用注册提取器。当使用组件独立的实现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;使用欧宝娱乐app下载地址\组件\PropertyInfo\\ReflectionExtractor;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\DateTimeNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;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真正的

ClassDiscriminatorResolverInterface实现的ObjectNormalizer

序列化器组件提供了一个实现的ClassDiscriminatorResolverInterface被称为ClassDiscriminatorFromClassMetadata它使用工厂和一个映射的类元数据配置正确的类的对象进行序列化和反序列化。

当使用该组件在一个Symfony启用应用程序和类元数据工厂的解释欧宝娱乐app下载地址属性组部分,这已经是建立和你只需要提供配置。否则:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /……使用欧宝娱乐app下载地址\组件\序列化器\编码器\JsonEncoder;使用欧宝娱乐app下载地址\组件\序列化器\映射\ClassDiscriminatorFromClassMetadata;使用欧宝娱乐app下载地址\组件\序列化器\映射\ClassDiscriminatorMapping;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;使用欧宝娱乐app下载地址\组件\序列化器\序列化器;美元classMetadataFactory=ClassMetadataFactory (AnnotationLoader (AnnotationReader ()));美元鉴频器=ClassDiscriminatorFromClassMetadata (美元classMetadataFactory);美元序列化器=序列化器([ObjectNormalizer (美元classMetadataFactory,,,,美元鉴频器)]、[json的= >JsonEncoder ()));

现在配置您的鉴别器类映射。考虑一个应用程序,该应用程序定义了一个抽象的CodeRepository类延长GitHubCodeRepositoryBitBucketCodeRepository类:

  • 属性
  • YAML
  • XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14
名称空间应用程序;使用应用程序\BitBucketCodeRepository;使用应用程序\GitHubCodeRepository;使用欧宝娱乐app下载地址\组件\序列化器\注释\DiscriminatorMap;# (DiscriminatorMap (typeProperty:“类型”,映射:github的= > GitHubCodeRepository::类,“bitbucket都”= > BitBucketCodeRepository::类,)))文摘CodeRepository{/ /……}

一旦配置完成,序列化器使用映射来选择正确的类:

1 2 3 4 5
美元序列化=美元序列化器- >序列化(GitHubCodeRepository (),json的);/ /{“类型”:“github”}美元存储库=美元序列化器- >反序列化(美元序列化,CodeRepository::类,json的);/ /运算符GitHubCodeRepository

另请参阅

标准化者Symfony序列化器组件支持流欧宝娱乐app下载地址行的web API格式(JSON-LD、GraphQL OpenAPI,哈尔,JSON: API)是可用的API的平台项目。

另请参阅

一个受欢迎的选择Symfony序列化器组件是第三方库,欧宝娱乐app下载地址JMS序列化器(版本之前v1.12.0Apache许可下发布的,因此不符合GPLv2项目)。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 6.2支持通过苏禄人
欧宝娱乐app下载地址Symfony 6.2支持通过Les-Tilleuls.coop
欧宝娱乐app下载地址Symfony代码性能”>< /a>
          <p class=欧宝娱乐app下载地址Symfony代码性能

代码消耗服务器资源。黑焰告诉你”>< /a>
          <p class=代码消耗服务器资源。黑焰告诉你

阅读我们完整的Symfony和PHP目录欧宝娱乐app下载地址为您的web开发需要的解决方案。”>< /a>
          <p class=阅读我们完整的Symfony和PHP目录欧宝娱乐app下载地址为您的web开发需要的解决方案。