How to Use the Serializer

Serializing and deserializing to and from objects and different formats (e.g. JSON or XML) is a very complex topic. Symfony comes with a Serializer Component, which gives you some tools that you can leverage for your solution.

In fact, before you start, get familiar with the serializer, normalizers and encoders by reading the Serializer Component. You should also check out the JMSSerializerBundle, which expands on the functionality offered by Symfony’s core serializer.

Activating the Serializer

2.3 新版功能: The Serializer has always existed in Symfony, but prior to Symfony 2.3, you needed to build the serializer service yourself.

The serializer service is not available by default. To turn it on, activate it in your configuration:

  • YAML
    # app/config/config.yml
    framework:
        # ...
        serializer:
            enabled: true
    
  • XML
    <!-- app/config/config.xml -->
    <framework:config>
        <!-- ... -->
        <framework:serializer enabled="true" />
    </framework:config>
    
  • PHP
    // app/config/config.php
    $container->loadFromExtension('framework', array(
        // ...
        'serializer' => array(
            'enabled' => true
        ),
    ));
    

Adding Normalizers and Encoders

Once enabled, the serializer service will be available in the container and will be loaded with two encoders (JsonEncoder and XmlEncoder) but no normalizers, meaning you’ll need to load your own.

You can load normalizers and/or encoders by tagging them as serializer.normalizer and serializer.encoder. It’s also possible to set the priority of the tag in order to decide the matching order.

Here is an example on how to load the GetSetMethodNormalizer:

  • YAML
    # app/config/config.yml
    services:
       get_set_method_normalizer:
          class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
          tags:
             - { name: serializer.normalizer }
    
  • XML
    <!-- app/config/config.xml -->
    <services>
        <service id="get_set_method_normalizer" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer">
            <tag name="serializer.normalizer" />
        </service>
    </services>
    
  • PHP
    // app/config/config.php
    use Symfony\Component\DependencyInjection\Definition;
    
    $definition = new Definition(
        'Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer'
    ));
    $definition->addTag('serializer.normalizer');
    $container->setDefinition('get_set_method_normalizer', $definition);