序列化器组件

要使用Serializer组件,请设置欧宝娱乐app下载地址symfony \ component \ serializer \ serializer指定哪些编码器和规范化器是可用的:

欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ encoder \ xmlencoder;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;$编码器=[XmlEncoder(),jsonencoder.()];$癌症=[ObjectNormalizer.()];$ Serializer.=序列化器$癌症$编码器);

首选的规格化器是欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer,但也可以使用其他的归一化器。下面显示的所有示例都使用ObjectNormalizer.

现在,如果要将此对象序列化为JSON,则只需使用之前创建的Serializer服务即可:

app \ model \ person;$人=();$人- >setname.'foo');$人- >设置99);$人- >setSportsperson错误的);$ jsonContent.=$ Serializer.- >连载$人'json');// $ jsonContent包含{“名称”:“foo”,“年龄”:99,“sportsperson”:false,“createat”:null}回声$ jsonContent.;//或在响应中返回它

第一个参数连载()是要序列化的对象,第二个是用于选择正确的编码器,在这种情况下欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化

反级式化对象类将以XML格式编码:

app \ model \ person;元数据=<<<EOF. foo 年龄<时代> 99 < / > false EOF.;$人=$ Serializer.- >反序列化元数据::班级'XML');

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

  1. 要解码的信息
  2. 此信息的类名称将被解码为
  3. 编码器用于将该信息转换为数组

默认情况下,Serializer组件将忽略未映射到非规范化对象的其他属性。如果您希望在发生这种情况时抛出异常,请设置AbstractNormalizer :: Allow_extra_Attributes.上下文选项错误的并提供一个实现的对象ClassMetadataFactoryInterface构造规范化器时:

app \ model \ person;元数据=<<<EOF. foo 年龄<时代> 99 < / ><城市>巴黎EOF.;// $ loader是本文稍后解释的任何有效加载器$ classmetadataTaFactory.=ClassMetadataFactory$ loader.);$规范化=ObjectNormalizer.$ classmetadataTaFactory.);$ Serializer.=序列化器([$规范化]);//这将抛出一个symfony \ com欧宝娱乐app下载地址ponent \ serializer \异常\ serthattributesexception//因为“城市”不是人类类的属性$人=$ Serializer.- >反序列化元数据::班级'XML'[AbstractNormalizer::allow_extra_attributes.=>错误的]);

这是使用ORM时的一个常见需求。

AbstractNormalizer :: Object_to_populate.仅用于顶级对象。如果该对象是树结构的根,则将使用新实例重新创建归一下数据中存在的所有子元素。

当。。。的时候AbstractObjectNormalizer :: Deep_Object_To_Populate.选项设置为true,即根的现有子节点Object_to_populate.从归一化数据更新,而不是重新创建它们的Denormalizer。注意deep_object_to_populate.仅适用于单个子对象,但不适用于对象数组。当存在于标准化数据中时仍将更换。

属性组
名称空间acme.;班级myobj.{公共$ foo;私人的美元的酒吧;公共函数getBar(){返回这个美元- >酒吧;}公共函数套管美元的酒吧{返回这个美元- >酒吧=美元的酒吧;}}

序列化的定义可以使用注释、XML或YAML来指定。这欧宝娱乐app下载地址symfony \ component \ serializer \ mapping \ factory \ classmetadataFactory规范化器将使用的对象必须知道要使用的格式。

以下代码显示了如何初始化欧宝娱乐app下载地址symfony \ component \ serializer \ mapping \ factory \ classmetadataFactory对于每种格式:

然后,创建组定义:

  • 注释
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18 19 20 21
    名称空间acme.;欧宝娱乐app下载地址Symfony \ Component \ Serializer \ Annotation \组;班级myobj.{/ *** @groups({group1“,”group2“})* /公共$ foo;/ *** @groups(“group3”)* /公共函数getBar()//是*也支持方法{返回这个美元- >酒吧;}/ /……}
  • 属性
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    名称空间acme.;欧宝娱乐app下载地址Symfony \ Component \ Serializer \ Annotation \组;班级myobj.{#[组(['group1','group2'])]公共$ foo;#[组([group3'])]公共函数getBar()//是*也支持方法{返回这个美元- >酒吧;}/ /……}
  • yaml.
    1 2 3 4 5 6
    acme \ myobj.属性Foo[“group1”“group2”]酒吧['Group3']
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    <?encoding="UTF-8"XMLNS =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mapping”XMLNS:XSI =“http://www.w3.org/2001/xmlschema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd”>名称=“acme \ myobj”><属性名称=“foo”><组>group1<组>group2> < /属性<属性名称=“酒吧”><组>group3> < /属性

您现在只能在所需的组中序列化属性:

欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;obj美元=myobj.();obj美元- >Foo='foo';obj美元- >套管“酒吧”);$规范化=ObjectNormalizer.$ classmetadataTaFactory.);$ Serializer.=序列化器([$规范化]);元数据=$ Serializer.- >正常化obj美元空值[“组织”=>“group1”]);// $ data = ['foo'=>'foo'];methoda美元=$ Serializer.- >非规范化['foo'=>'foo'“酒吧”=>“酒吧”],“MyObj”空值[“组织”=>[“group1”'Group3']);// $ obj2 = myobj(foo:'foo',酒吧:'bar')

选择特定的属性
欧宝娱乐app下载地址Symfony \组件\ \标准化者\ AbstractNormalizer进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;班级用户{公共$ familyname.;公共givenName美元;公共美元公司;}班级公司{公共美元的名字;公共$地址;}美元公司=公司();美元公司- >名称=“Les-Tilleuls.coop”;美元公司- >地址=法国里尔的;$用户=用户();$用户- >familyName=“Dunglas”;$用户- >给定的名称=“凯文”;$用户- >公司=美元公司;$ Serializer.=序列化器([ObjectNormalizer.()]);元数据=$ Serializer.- >正常化$用户空值[AbstractNormalizer::属性=>['姓'“公司”=>[“名字”]]]);/ / $ data = [' familyName ' = > ' Dunglas ', '公司' = >['名字' = > ' Les-Tilleuls.coop ']);

只有没有被忽略的属性(见下面)是可用的。如果设置了一些序列化组,则只能使用这些组允许的属性。

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

忽略属性

选项1:使用@ ignore注解
  • 注释
    1 2 3 4 5 6 7 8 9 10 11 12 13
    名称空间App \模型;欧宝娱乐app下载地址Symfony \序列化器\注释\ \组件忽视;班级我的课{公共$ foo;/ *** @忽略()* /公共美元的酒吧;}
  • 属性
    1 2 3 4 5 6 7 8 9 10 11
    名称空间App \模型;欧宝娱乐app下载地址Symfony \序列化器\注释\ \组件忽视;班级我的课{公共$ foo;#[忽略]公共美元的酒吧;}
  • yaml.
    1 2 3 4
    app \ model \ myclass属性酒吧忽略真的
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12
    <?xml version = " 1.0 " ? >XMLNS =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mapping”XMLNS:XSI =“http://www.w3.org/2001/xmlschema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd”>名称=“app \ model \ myclass”><属性名称=“酒吧”><忽略>真的< /忽略>> < /属性

您现在可以在序列化期间忽略特定属性:

app \ model \ myclass;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;obj美元=我的课();obj美元- >Foo='foo';obj美元- >酒吧=“酒吧”;$规范化=ObjectNormalizer.$ classmetadataTaFactory.);$ Serializer.=序列化器([$规范化]);元数据=$ Serializer.- >正常化obj美元);// $ data = ['foo'=>'foo'];

选项2:使用上下文AbstractNormalizer: IGNORED_ATTRIBUTES的关键语境序列化器方法:

acme \人;欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化;欧宝娱乐app下载地址Symfony \组件\ \标准化者\ AbstractNormalizer进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;$人=();$人- >setname.'foo');$人- >设置99);$规范化=ObjectNormalizer.();美元的编码器=jsonencoder.();$ Serializer.=序列化器([$规范化],[美元的编码器]);$ Serializer.- >连载$人'json'[AbstractNormalizer::IGNORED_ATTRIBUTES=>[“年龄”]]);//输出:{“名称”:“foo”}

序列化和反序列化时转换属性名称
班级公司{公共美元的名字;公共$地址;}

并且在序列化形式中,所有属性必须以前缀为前缀org_如下:

{“org_name”“Acme公司。”“org_address”“123大街,大城市”}

自定义名称转换器可以处理此类情况:

欧宝娱乐app下载地址Symfony \组件\ \ NameConverter \ NameConverterInterface进行序列化;班级orgprefixnameConverter.实现了nameConverterinterface.{公共函数正常化细绳$ propertyName.{返回'org_'$ propertyName.;}公共函数非规范化细绳$ propertyName.{//删除'org_'前缀返回'org_'===.Substr.$ propertyName.0.4.Substr.$ propertyName.4.$ propertyName.;}}

通过将自定义名称转换器作为任何类扩展的第二个参数传递,可以使用它欧宝娱乐app下载地址Symfony \组件\ \标准化者\ AbstractNormalizer进行序列化, 包括欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ getsetmethodnormalizer欧宝娱乐app下载地址Symfony \组件\ \标准化者\ PropertyNormalizer进行序列化

欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;nameConverter美元=orgprefixnameConverter.();$规范化=ObjectNormalizer.空值nameConverter美元);$ Serializer.=序列化器([$规范化],[jsonencoder.()]);美元公司=公司();美元公司- >名称=“Acme公司”。;美元公司- >地址=“大城市大街123号”;$ json.=$ Serializer.- >连载美元公司'json');// {“org_name”:“Acme Inc.”,“org_address”:“123 Main Street,Big City”}$ CompanyCopy.=$ Serializer.- >反序列化$ json.公司::班级'json');//与$公司的数据相同

笔记

您也可以实施欧宝娱乐app下载地址symfony \ component \ serializer \ nameConverter \ AdvancedNameConverterInterface访问当前类名称,格式和上下文。

骆驼箱到Snake_case.PSR-1标准不推荐属性名称的任何特定情况)。

欧宝娱乐app下载地址Symfony提供了一个内置的名称转换器,用于在序列化和反序列化过程中在snake_case和camelcase样式之间进行转换:

欧宝娱乐app下载地址symfony \ component \ serializer \ nameConverter \ camelcasetosnakecasenameConverter;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;$规范化=ObjectNormalizer.空值CamelCaseToSnakeCaseNameConverter());班级{私人的$ firstname.;公共函数__构造$ firstname.{这个美元- >firstName=$ firstname.;}公共函数getfirstname.(){返回这个美元- >firstName;}}凯文美元=“凯文”);$规范化- >正常化凯文美元);// ['first_name'=>'kévin'];$ Anne.=$规范化- >非规范化(['名'=>'安妮'],'人');//使用firstname的人物对象:'Anne'

使用元数据配置名称转换属性组部分,这已经设置了,您只需要提供配置。除此以外:

/ /……欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ nameConverter \ MetadataAwarenameConverter;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;$ classmetadataTaFactory.=ClassMetadataFactoryannotationloder.AnnotationReader()));$ MetadataAwarenameConverter.=MetadataAwarenameConverter.$ classmetadataTaFactory.);$ Serializer.=序列化器[ObjectNormalizer.$ classmetadataTaFactory.$ MetadataAwarenameConverter.),['json'=>jsonencoder.()]);

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

  • 注释
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    名称空间应用程序\实体;欧宝娱乐app下载地址Symfony \ Component \ Serializer \ Annotation \ SerializedName;班级{/ *** @SerializedName(“customer_name”)* /私人的$ firstname.;公共函数__构造$ firstname.{这个美元- >firstName=$ firstname.;}/ /……}
  • 属性
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    名称空间应用程序\实体;欧宝娱乐app下载地址Symfony \ Component \ Serializer \ Annotation \ SerializedName;班级{#[serializedname('customer_name')]私人的$ firstname.;公共函数__构造$ firstname.{这个美元- >firstName=$ firstname.;}/ /……}
  • yaml.
    1 2 3 4
    app \实体\人属性firstNameserialized_name顾客姓名
  • XML.
    1 2 3 4 5 6 7 8 9 10
    <?encoding="UTF-8"XMLNS =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mapping”XMLNS:XSI =“http://www.w3.org/2001/xmlschema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd”>名称=“app \实体\ person”><属性名称=“名”序列化 - 名称=“customer_name”/>

此自定义映射用于在序列化和反序列化对象时转换属性名称:

$序列化=$ Serializer.- >连载“凯文”),'json');/ /{“customer_name”:“凯文”}

序列化布尔属性, 喜欢app \ model \ person :: issportsperson())时,Serializer组件将自动检测并使用它来序列化相关属性。

ObjectNormalizer.也照顾开始的方法具有添加去掉

使用回调与对象实例序列化属性
app \ model \ person;欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ getsetmethodnormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;美元的编码器=jsonencoder.();//所有回调参数都是可选的(您可以省略您不使用的参数)$ DateCallback.=函数$ innerobject.outerObject美元细绳attributeName美元细绳美元的格式=空值数组美元的上下文=[]){返回$ innerobject.instanceof.\ DateTime$ innerobject.- >格式\ DateTime::ISO8601.'';};$ defaultContext.=[AbstractNormalizer::回调=>['创造'=>$ DateCallback.],];$规范化=getsetMethodnormalizer空值空值空值空值空值$ defaultContext.);$ Serializer.=序列化器([$规范化],[美元的编码器]);$人=();$人- >setname.“慈核”);$人- >设置34.);$人- >setCreatedAt\ DateTime“现在”));$ Serializer.- >连载$人'json');//输出:{“名称”:“CordOval”,“年龄”:34,“创造”:“2014-03-22T09:43:12-0500”}

标准化者欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ normalizableInterface对于规范化(对象到数组)和欧宝娱乐app下载地址Symfony \组件\ \标准化者\ DenormalizableInterface进行序列化去正规化(数组到对象)。

你可以通过Serializer的第一个构造函数参数向它添加新的normalizer:

欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;$癌症=[ObjectNormalizer.()];$ Serializer.=序列化器$癌症[]);

内置癌症
欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer

这个规范化器利用了propertyaccess组件读取和写入对象。这意味着它可以直接访问属性,并通过getter、setter、hassers、isers、加法器和移除器。它支持在Denormalization过程中调用构造函数。

对象被标准化为属性名称和值的映射(通过删除名称来生成得到具有添加或者去掉从方法名称的前缀并将第一个字母转换为小写;例如getfirstname()- >firstName)。

ObjectNormalizer.是最强大的正常化器。默认情况下,它是在启用Serializer组件的Symfony欧宝娱乐app下载地址应用程序中配置的。

欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ getsetmethodnormalizer

这个规范化器通过调用“getter”(以“get”开头的公共方法)来读取类的内容。它将通过调用构造函数和“setter”(以“set”开头的公共方法)来反规范化数据。

对象被标准化为属性名称和值的映射(通过删除名称来生成得到从方法名称的前缀并将第一个字母转换为小写;例如getfirstname()- >firstName)。

欧宝娱乐app下载地址Symfony \组件\ \标准化者\ PropertyNormalizer进行序列化

这个规范化器直接读写公共属性和私有和保护属性(来自类和所有父类)。它支持在Denormalization过程中调用构造函数。

对象被标准化为属性值的属性名称的映射。

欧宝娱乐app下载地址symfony \ component \ serializer \ promalizer \ jsonserializablezablenorizer

此规范化器用于实现的类JSonserializable.

它会打电话给JSonserializable :: JSonserialize()方法,然后进一步归一化结果。这意味着嵌套JSonserializable.类也将被标准化。

当您希望使用简单逐渐从现有的代码库逐渐迁移时,此规范器特别有用json_encode.到Symfon欧宝娱乐app下载地址y Serializer,允许您混合使用哪个规范化器用于哪个类。

json_encode.可以处理循环引用。

欧宝娱乐app下载地址symfony \ component \ serializer \ promalyizer \ datetimenormalizer
这个标准化者转换DateTimeInterface.对象(如。约会时间dateTimeImmutable.)字符串。默认情况下,它使用了RFC3339.格式。
欧宝娱乐app下载地址symfony \ component \ serializer \ promalizer \ datetimezonenormalizer
这个标准化者转换DateTimeZone.对象传入表示时区名称的字符串PHP时区列表
欧宝娱乐app下载地址Symfony \组件\ \标准化者\ DataUriNormalizer进行序列化
这个标准化者转换SplFileInfo对象到数据URI字符串中(数据:...),这样文件就可以嵌入到序列化数据中。
欧宝娱乐app下载地址symfony \ component \ serializer \ promalizer \ dateIntervalNormAlizer
这个标准化者转换DateInterval.对象进入字符串。默认情况下,它使用了P%YY%MM%DDT%HH%IM%SS格式。
欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ formarrornormalizer

此规范化器用于实现的类欧宝娱乐app下载地址Symfony \组件\ \ FormInterface形式

它将从表单中获取错误,并将它们规范化为一个规范化数组。

欧宝娱乐app下载地址Symfony \组件\ \标准化者\ ConstraintViolationListNormalizer进行序列化
此规范化器会转换实现的对象欧宝娱乐app下载地址symfony \ component \ validator \ constraindviolationListInterface根据符合的错误列表RFC 7807.标准。
欧宝娱乐app下载地址symfony \ component \ serializer \ normalizer \ transionNormalizer
根据API问题规范正常化误差RFC 7807.
欧宝娱乐app下载地址symfony \ component \ serializer \ promalyizer \ customnormalizer
使用实现的对象将PHP对象标准化欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ normalizableInterface
欧宝娱乐app下载地址Symfony \ Component \ Serializer \ Normalizer \ UidNormalizer
此规范化器会转换实现的对象欧宝娱乐app下载地址Symfony \ \ Uid \ AbstractUid组件陷入困境。它也可以是非规范化的uuid.或者ulid串到欧宝娱乐app下载地址symfony \ component \ uid \ uuid或者欧宝娱乐app下载地址symfony \ component \ uid \ ulid

5.2新版功能:UidNormalizer在Symfony 5.2中介绍。欧宝娱乐app下载地址

笔记

您还可以创建自己的规范化以使用其他结构。阅读更多如何创建自定义规范化器

在Symfony应用程序中使用Serializer组件时,默认情况下启用所有这些常规文件。欧宝娱乐app下载地址

编码器欧宝娱乐app下载地址symfony \ component \ serializer \ encoder \ concoder接口用于编码(数组格式)和欧宝娱乐app下载地址Symfony \组件\ \编码器\ DecoderInterface进行序列化用于解码(格式到数组)。

您可以使用其第二个构造函数参数将新编码器添加到序列化器实例:

欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ encoder \ xmlencoder;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;$编码器=[XmlEncoder(),jsonencoder.()];$ Serializer.=序列化器([],$编码器);

内置编码器
欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化
此类编码和解码数据杰森
欧宝娱乐app下载地址symfony \ component \ serializer \ encoder \ xmlencoder
此类编码和解码数据XML.
欧宝娱乐app下载地址Symfony \组件\ \编码器\ YamlEncoder进行序列化
此编码器对数据进行编码和解码yaml..这个编码器需要yaml组件
欧宝娱乐app下载地址symfony \ component \ serializer \ encoder \ csvencoder
此编码器对数据进行编码和解码CSV

笔记

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

在Symfony应用程序中使用Serializer组件时,默认情况下启用所有这些编码器。欧宝娱乐app下载地址

jsonencoder.jsonencoder.根据PHP,从JSON字符串进行编码和解码json_encode.json_decode.职能。修改这些功能如何通过提供诸如此选项的函数在某些情况下运行json_preeserve_zero_fraction..您可以使用序列化上下文来使用密钥传递这些选项json_encode_options.或者json_decode_options分别:

这个美元- >序列化器- >连载元数据'json'['json_encode_options'=>\ json_preeserve_zero_fraction.]);

XmlEncoder将为类似的对象编码:

1 2 3 4 5 6
<?encoding="UTF-8"<响应>121

特殊的密钥可用于定义节点的数据:

['foo'=>['@酒吧'=>'价值'“#”=>'Baz']];//编码如下:/ / < ?xml version = " 1.0 " ?>// <响应>// / /巴兹// // 

此外,以@将被视为属性,并且是关键#评论可用于编码XML评论:

美元的编码器=XmlEncoder();美元的编码器- >编码(['foo'=>['@酒吧'=>'价值'],“qux”=>['#评论'=>'一条评论'],],'XML');/ /返回:/ / < ?xml version = " 1.0 " ?>// <响应>// / / < qux > < !-评论-!> < qux >// 

您可以传递上下文键as_collection为了使结果始终作为一个集合。

小费

在解码内容时,默认情况下会忽略XML注释,但可以使用可选的上下文键更改这种行为xmlencoder :: decoder_ignored_node_types.

数据有#评论键在默认情况下被编码成XML注释。这可以通过optional来更改$ cencoderignoredNodetypes.争论XmlEncoder类构造函数。

Yamlencoder.yaml组件从亚马尔变换到亚马尔。

空值价值空值价值。您可以通过设置来更改此行为AbstractObjectNormalizer :: skip_null_values.上下文选项真的

$假人=班级{公共$ foo;公共$酒吧='notnull';};$normalizer = new ObjectNormalizer();$结果= $ normalizer-> Normalize($虚拟,'JSON',[AbstractObjjectNormalizer :: Skip_null_Values => True]);// ['bar'=>'notnull']

处理循环参考文献
班级组织{私人的美元的名字;私人的$议员;公共函数setname.美元的名字{这个美元- >名称=美元的名字;}公共函数getName.(){返回这个美元- >名称;}公共函数塞曼斯数组$议员{这个美元- >成员=$议员;}公共函数Getmembers.(){返回这个美元- >成员;}}班级成员{私人的美元的名字;私人的美元的组织;公共函数setname.美元的名字{这个美元- >名称=美元的名字;}公共函数getName.(){返回这个美元- >名称;}公共函数setOrganization组织美元的组织{这个美元- >组织=美元的组织;}公共函数家用(){返回这个美元- >组织;}}

避免无限循环,欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ getsetmethodnormalizer或者欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer扔一个欧宝娱乐app下载地址symfony \ component \ serializer \异常\ circularreferenceException当遇到这样的情况时:

美元的成员=成员();美元的成员- >setname.“凯文”);美元的组织=组织();美元的组织- >setname.“Les-Tilleuls.coop”);美元的组织- >塞曼斯([美元的成员]);美元的成员- >setOrganization美元的组织);回声$ Serializer.- >连载美元的组织'json');//抛出循环交易所

钥匙circular_reference_limit在默认上下文中,设置在考虑其循环引用之前将序列化相同对象的次数。默认值是1

循环引用也可以由自定义可调用对象处理,而不是抛出异常。这在序列化具有唯一标识符的实体时特别有用:

美元的编码器=jsonencoder.();$ defaultContext.=[AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER=>函数$对象美元的格式美元的上下文{返回$对象- >getName.();},];$规范化=ObjectNormalizer.空值空值空值空值空值空值$ defaultContext.);$ Serializer.=序列化器([$规范化],[美元的编码器]);var_dump.$ Serializer.- >连载$ org.'json'));// {“name”:“les-tilleuls.cop”,“会员”:[{“名称”:“k \ u00e9vin”,组织:“les-illleleuls.coop”}“}

处理序列化深度
名称空间acme.;班级myobj.{公共$ foo;/ *** @var self.* /公共$ child.;}$ 0001.=myobj.();$ 0001.- >Foo=“使”;$级别2=myobj.();$级别2- >Foo=“二级”;$ 0001.- >孩子=$级别2;$ spe3.=myobj.();$ spe3.- >Foo=level3的;$级别2- >孩子=$ spe3.;

串行器可以配置为为特定属性设置最大深度。在这里,我们将它设置为2$ child.属性:

必须配置与所选格式对应的元数据加载程序才能使用此功能。在Symfony应用程序中使用Serializer组件时自动完成。欧宝娱乐app下载地址使用独立组件时,请参阅组的文档欧宝体育电话去学习如何去做。

检查仅在AbstractObjectNormalizer :: Enable_Max_Depth.序列化器上下文的键设置为真的.在以下示例中,第三级不序列化,因为它比配置的最大深度更深:

$结果=$ Serializer.- >正常化$ 0001.空值[AbstractObjectNormalizer::启用_max_depth.=>真的]);/ *$结果= ['foo'=>'level1','孩子'=> ['foo'=>'level2','孩子'=> ['孩子'=> null,],],];* /

当达到最大深度时,可以执行自定义可调用对象,而不是抛出异常。这在序列化具有唯一标识符的实体时特别有用:

主义\ \ \ AnnotationReader注释;欧宝娱乐app下载地址Symfony \组件\序列化器\ \ MaxDepth注释;欧宝娱乐app下载地址symfony \ component \ serializer \ mapping \ factory \ classmetadataFactory;欧宝娱乐app下载地址Symfony \ \序列化器\ \程序\ AnnotationLoader映射组件;欧宝娱乐app下载地址Symfony \组件\ \标准化者\ AbstractObjectNormalizer进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;班级Foo{公共$ ID;/ *** @MaxDepth (1)* /公共$ child.;}$ 0001.=Foo();$ 0001.- >ID=1;$级别2=Foo();$级别2- >ID=2;$ 0001.- >孩子=$级别2;$ spe3.=Foo();$ spe3.- >ID=3.;$级别2- >孩子=$ spe3.;$ classmetadataTaFactory.=ClassMetadataFactoryannotationloder.AnnotationReader()));//所有回调参数都是可选的(您可以省略您不使用的参数)$ maxdepthhandler.=函数$ innerobject.outerObject美元细绳attributeName美元细绳美元的格式=空值数组美元的上下文=[]){返回'/ foos /'$ innerobject.- >ID;};$ defaultContext.=[AbstractObjectNormalizer::max_depth_handler.=>$ maxdepthhandler.];$规范化=ObjectNormalizer.$ classmetadataTaFactory.空值空值空值空值空值$ defaultContext.);$ Serializer.=序列化器([$规范化]);$结果=$ Serializer.- >正常化$ 0001.空值[AbstractObjectNormalizer::启用_max_depth.=>真的]);/ *$结果= [“id”= > 1,'孩子'=> ['id'=> 2,'孩子'=>'/ foos / 3',],];* /

处理数组
acme \人;$ person1.=();$ person1.- >setname.'foo');$ person1.- >设置99);$ person1.- >SetterPortsman.错误的);$ person2.=();$ person2.- >setname.“酒吧”);$ person2.- >设置33.);$ person2.- >SetterPortsman.真的);$人员=[$ person1.$ person2.];元数据=$ Serializer.- >连载$人员'json');/ /数据包含美元[{“名称”:“foo”,“年龄”:99年,“运动员”:假},{“名称”:“酒吧”,“年龄”:33岁的“运动员”:真正}]

如果要反序列化这样的结构,则需要添加欧宝娱乐app下载地址Symfony \ Component \ Serializer \ Normalizer \ ArrayDenormalizer到了一组癌症。通过附加[]的类型参数反序列化()方法,您指示您期望一个数组而不是单个对象:

欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化;欧宝娱乐app下载地址Symfony \ Component \ Serializer \ Normalizer \ ArrayDenormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ getsetmethodnormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;$ Serializer.=序列化器[getsetMethodnormalizer(),ArrayDenormalizer(),[jsonencoder.()]);元数据=...;//前面例子中的序列化数据$人员=$ Serializer.- >反序列化元数据'acme \ person []''json');

处理构造函数参数值对象如果缺少某些参数,序列化器将无法创建对象。在这些情况下,使用default_construstor_arguments.上下文选项:

欧宝娱乐app下载地址Symfony \组件\ \标准化者\ AbstractNormalizer进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;班级myobj.{私人的$ foo;私人的美元的酒吧;公共函数__构造$ foo美元的酒吧{这个美元- >Foo=$ foo;这个美元- >酒吧=美元的酒吧;}}$规范化=ObjectNormalizer.$ classmetadataTaFactory.);$ Serializer.=序列化器([$规范化]);元数据=$ Serializer.- >非规范化['foo'=>'你好'],“MyObj”空值[AbstractNormalizer::default_construstor_arguments.=>[“MyObj”=>['foo'=>''“酒吧”=>''],]);// $ data = new myobj('hello','');

递归非正规化和类型安全propertyInfo组件要使复杂类型(对象)表示。将使用提供的提取器猜测类的类型的类型,并用于递归地为内部数据进行异常。

当在Symfony应用程序中使用此组件时,所有规范化器都会自动欧宝娱乐app下载地址配置为使用已注册的提取器。的实现欧宝娱乐app下载地址Symfony \ \ PropertyInfo \ PropertyTypeExtractorInterface组件,(通常是一个实例欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInfoExtractor)必须作为第4参数传递ObjectNormalizer.

名称空间acme.;欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor;欧宝娱乐app下载地址symfony \ component \ serializer \ promalyizer \ datetimenormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;班级ObjectOuter{私人的美元内;私人的美元的日期;公共函数getinner.(){返回这个美元- >;}公共函数setinner.Objectinner.美元内{这个美元- >=美元内;}公共函数设置当前日期\ datetimeInterface.美元的日期{这个美元- >日期=美元的日期;}公共函数GetDate.(){返回这个美元- >日期;}}班级Objectinner.{公共$ foo;公共美元的酒吧;}$规范化=ObjectNormalizer.空值空值空值反射呼吸反射器());$ Serializer.=序列化器([DateTimeNormalizer(),$规范化]);obj美元=$ Serializer.- >非规范化['内'=>['foo'=>'foo'“酒吧”=>“酒吧”],'日期'=>'1988/01/21'],'acme \ objectouter');转储obj美元- >getinner.()- >Foo);//'foo'转储obj美元- >getinner.()- >酒吧);// '酒吧'转储obj美元- >GetDate.()- >格式'y-m-d'));//'1988-01-21'

当一个propertytepeextractor.可用,标准化器还将检查数据以DeNormalize匹配属性的类型(即使是原始类型)。例如,如果是细绳提供了,但属性的类型是int, 一个欧宝娱乐app下载地址symfony \ component \ serializer \异常\ MemedionValueexception将被抛出。通过设置序列化器上下文选项,可以禁用属性的类型强制执行ObjectNormalizer :: disable_type_enforcement.真的

序列化接口和抽象类欧宝娱乐app下载地址symfony \ component \ serializer \ mapping \ classdiscriminatorResolverInterface实施到欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer

序列化器组件提供了实施ClassDiscriminatorResolverInterface欧宝娱乐app下载地址symfony \ component \ serializer \ mapping \ classdiscriminatorfromclassmetadata它使用类元数据厂和映射配置来序列化和反序列化正确类的对象。

在Symfony应用程序中使用此组件时,类元数据工厂将如欧宝娱乐app下载地址属性组部分,这已经设置了,您只需要提供配置。除此以外:

/ /……欧宝娱乐app下载地址Symfony \组件\ \编码器\ JsonEncoder进行序列化;欧宝娱乐app下载地址symfony \ component \ serializer \ mapping \ classdiscriminatorfromclassmetadata;欧宝娱乐app下载地址symfony \ component \ serializer \ mapping \ classdiscriminatormapping;欧宝娱乐app下载地址symfony \ component \ serializer \ normenizer \ ObjectNormalizer;欧宝娱乐app下载地址symfony \ component \ serializer \ serializer;$ classmetadataTaFactory.=ClassMetadataFactoryannotationloder.AnnotationReader()));美元的鉴频器=ClassDiscriminatorFromClassMetadata$ classmetadataTaFactory.);$ Serializer.=序列化器[ObjectNormalizer.$ classmetadataTaFactory.空值空值空值美元的鉴频器),['json'=>jsonencoder.()]);

现在配置鉴别器类映射。考虑一个定义抽象的应用程序CodeRepository班级延伸githubcoderepository.bitbucketcoderepository.课程:

  • 注释
    12 3 4 5 6 7 8 9 10 11 12 13 14
    名称空间应用程序;欧宝娱乐app下载地址Symfony \组件\序列化器\ \ DiscriminatorMap注释;/ *** @DiscriminatorMap (typeProperty =“类型”,映射= {*“github”=“App \ GitHubCodeRepository”,*“bitbucket”=“app \ bitbucketcoderepository”*})* /摘要班级CodeRepository{/ /……}
  • 属性
    12 3 4 5 6 7 8 9 10 11 12 13 14
    名称空间应用程序;app \ bitbucketcoderepository.;app \ githubcoderepository.;欧宝娱乐app下载地址Symfony \组件\序列化器\ \ DiscriminatorMap注释;#[isciminatormap(typeproperty:'类型',映射:['github'=>githubcoderepository.::班级'bitbucket'=>bitbucketcoderepository.::班级)))摘要班级CodeRepository{/ /……}
  • yaml.
    1 2 3 4 5 6
    app \ coderepository.isciminator_map.type_property.类型映射GitHub.'app \ githubcoderepository'Bitbucket.“App \ BitBucketCodeRepository”
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    <?encoding="UTF-8"XMLNS =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mapping”XMLNS:XSI =“http://www.w3.org/2001/xmlschema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd”>名称=“app \ coderepository”><鉴别者 - 地图type-property =“类型”><映射类型=“github”类=“app \ githubcoderepository”/><映射类型=“bitbucket都”类=“app \ bitbucketcoderepository”/>< / discriminator-map >

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

$序列化=$ Serializer.- >连载githubcoderepository.(),'json');// {“类型”:“github”}美元的存储库=$ Serializer.- >反序列化$序列化CodeRepository::班级'json');// instanceof githubcoderepository.

学到更多

也可以看看

支持流行Web API格式的Symfon欧宝娱乐app下载地址y Serializer组件的癌症(JSON-LD,GraphQL,OpenAPI,Hal,JSON:API)可作为其中的一部分提供API的平台项目。

也可以看看

Symfony Serializer组件的流行替代品是第三欧宝娱乐app下载地址方库,JMS序列化器(版本之前v1.12.0是在Apache许可下发布的,所以与GPLv2项目不兼容)。

这项工作包括代码样本,是在a下获得的许可创作共用BY-SA 3.0执照。