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

Nuevo en la versión 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 (Symfony\Component\Serializer\Encoder\JsonEncoder and Symfony\Component\Serializer\Encoder\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 an example on how to load the load the Symfony\Component\Serializer\Normalizer\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);
    

Nota

The Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer is broken by design. As soon as you have a circular object graph, an infinite loop is created when calling the getters. You’re encouraged to add your own normalizers that fit your use-case.

Bifúrcame en GitHub