如何使用序列化(Serializer)

收藏486

阅读25465

更新时间2022-04-13

一个对象和不同格式(比如JSON或XML)之间的序列化和反序列化是一个非常复杂的话题。Symfony自带了一个 Serializer组件,给你提供了一些工具,可以随需利用。

实际上,在你开始使用之前,先熟悉一下serializer,normalizer和encoder,阅读 Serializer组件 一文。

激活Serializer 

serializer 服务默认不可用。要开启它,在你的配置文件中激活它:

PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'enabled' => true,
    ),));
XML:
    
        
        
    
YAML:# app/config/config.ymlframework:    # ...
    serializer:
        enabled: true

使用Serializer服务 

一旦开启, serializer 服务可以在你需要它时注入到任何服务中,或者像下面这样在控制器中使用:

// src/AppBundle/Controller/DefaultController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller{
    public function indexAction()
    {
        $serializer = $this->get('serializer');         // ...
    }}

添加Normalizers和Encoders 

被开启之后, serializer 在容器中可用,被加载时还带有两个 encodersJsonEncoderXmlEncoder)以及ObjectNormalizer normalizer

你可以加载normalizers和/或encoders,只要给它们打上 serializer.normalizerserializer.encoder 标签。也可以设置标签的优先级,以便决定匹配顺序。

下例演示了如何加载 GetSetMethodNormalizer

PHP:// app/config/services.phpuse Symfony\Component\DependencyInjection\Definition; $definition = new Definition(
    'Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer'));$definition->setPublic(false);$definition->addTag('serializer.normalizer');$container->setDefinition('get_set_method_normalizer', $definition);
XML:
    
        
    
YAML:# app/config/services.ymlservices:
    get_set_method_normalizer:
        class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
        public: false
        tags:
            - { name: serializer.normalizer }

使用序列化的群组Annotations 

通过以下配置来开启 序列化群组注释

PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'enable_annotations' => true,
    ),));
XML:
    
    
YAML:# app/config/config.ymlframework:    # ...
    serializer:
        enable_annotations: true

接下来,添加 @Goups annotations 到你的类中,然后在序列化时,选择要使用哪个群组:

$serializer = $this->get('serializer');$json = $serializer->serialize(
    $someObject,
    'json', array('groups' => array('group1')));

除了  @Groups  注释,serializer组件还支持Yaml或Xml文件。这些组件在存放于以下位置时将被自动加载:

  • 存放在bundle下面的  Resources/config/  目录中的  serialization.yml  或  serialization.xml

  • 存放在bundle下面的  Resources/config/serialization/  目录中的所有  *.yml  和  *.xml

开启Metadata缓存 

被Serializer组件所使用的metadata,诸如groups,可以被缓存,以提升程序性能。任何实现了 Doctrine\Common\Cache\Cache 接口的服务都可以被使用。

一个利用了 APCu 的服务被内置在框架中:

PHP:// app/config/config_prod.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'cache' => 'serializer.mapping.cache.apc',
    ),));
XML:
    
    
YAML:# app/config/config_prod.ymlframework:    # ...
    serializer:
        cache: serializer.mapping.cache.apc

开启一个命名转换器 

2.8 name_converter  选项从Symfony 2.8开始被引入。

要使用 name converter服务,可以在配置文件中使用 name_converter选项进行定义。

内置的 CamelCase to snake_case name converter(驼峰转蛇型转换器)可以通过设置 serializer.name_converter.camel_case_to_snake_case 选项值来开启:

PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'name_converter' => 'serializer.name_converter.camel_case_to_snake_case,
    ),
));
XML:
    
    
YAML:# app/config/config.ymlframework:    # ...
    serializer:
        name_converter: 'serializer.name_converter.camel_case_to_snake_case'

深入Serializer 

ApiPlatform 提供了一个API系统,它支持 JSON-LDHydra Core Vocabulary hypermedia格式。它是基于Symfony框架和Serializer组件而构建的。它提供了自定义的normalizers,一个自定义的encoder,自定义的metadata以及一个缓存系统。

如果你希望利用好Symfony Serializer组件的全部威力,应该看一看这个bundle是如何工作的。

科技资讯

更多

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.7万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

70.9万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.6万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

33.9万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号