如果你想反序列化这样的结构,你需要添加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的);
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
使用ob娱乐下载\组件\序列化器\标准化者\AbstractNormalizer;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;类MyObj{公共函数__construct(私人美元喷火,私人美元酒吧,){}}美元标准化者=新ObjectNormalizer (美元classMetadataFactory);美元序列化器=新序列化器([美元标准化者]);美元数据=美元序列化器- >denormalize ([“foo”= >“你好”),“MyObj”,零,(AbstractNormalizer::DEFAULT_CONSTRUCTOR_ARGUMENTS = > [“MyObj”= > [“foo”= >”,“酒吧”= >”]]]);/ / $ data = new MyObj(‘你好’,”);
当使用该组件在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
来真正的
。
序列化器组件提供了一个实现的ClassDiscriminatorResolverInterface
被称为ClassDiscriminatorFromClassMetadata它使用工厂和一个映射的类元数据配置正确的类的对象进行序列化和反序列化。
当使用该组件在一个Symfony启用应用程序和类元数据工厂的解释ob娱乐下载属性组部分,这已经是建立和你只需要提供配置。否则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /……使用ob娱乐下载\组件\序列化器\编码器\JsonEncoder;使用ob娱乐下载\组件\序列化器\映射\ClassDiscriminatorFromClassMetadata;使用ob娱乐下载\组件\序列化器\映射\ClassDiscriminatorMapping;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;使用ob娱乐下载\组件\序列化器\序列化器;美元classMetadataFactory=新ClassMetadataFactory (新AnnotationLoader (新AnnotationReader ()));美元鉴频器=新ClassDiscriminatorFromClassMetadata (美元classMetadataFactory);美元序列化器=新序列化器([新ObjectNormalizer (美元classMetadataFactory,零,零,零,美元鉴频器)]、[json的= >新JsonEncoder ()));
现在配置您的鉴别器类映射。考虑一个应用程序,该应用程序定义了一个抽象的CodeRepository
类延长GitHubCodeRepository
和BitBucketCodeRepository
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
名称空间应用程序;使用应用程序\BitBucketCodeRepository;使用应用程序\GitHubCodeRepository;使用ob娱乐下载\组件\序列化器\注释\DiscriminatorMap;# (DiscriminatorMap (typeProperty:“类型”,映射:github的= > GitHubCodeRepository::类,“bitbucket都”= > BitBucketCodeRepository::类,)))文摘类CodeRepository{/ /……}
一旦配置完成,序列化器使用映射来选择正确的类:
1 2 3 4 5
美元序列化=美元序列化器- >序列化(新GitHubCodeRepository (),json的);/ /{“类型”:“github”}美元存储库=美元序列化器- >反序列化(美元序列化,CodeRepository::类,json的);/ /运算符GitHubCodeRepository
另请参阅
一个受欢迎的选择Symfony序列化器组件是第三方库,ob娱乐下载JMS序列化器(版本之前v1.12.0
Apache许可下发布的,因此不符合GPLv2项目)。