<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter key="serializer.mapping.cache.file">%kernel.cache_dir%/serialization.php</parameter>
        <parameter key="serializer.mapping.cache.prefix" />
    </parameters>

    <services>
        <defaults public="false" />

        <service id="serializer" class="Symfony\Component\Serializer\Serializer" public="true">
            <argument type="collection" />
            <argument type="collection" />
        </service>
        <service id="Symfony\Component\Serializer\SerializerInterface" alias="serializer" />
        <service id="Symfony\Component\Serializer\Normalizer\NormalizerInterface" alias="serializer" />
        <service id="Symfony\Component\Serializer\Normalizer\DenormalizerInterface" alias="serializer" />
        <service id="Symfony\Component\Serializer\Encoder\EncoderInterface" alias="serializer" />
        <service id="Symfony\Component\Serializer\Encoder\DecoderInterface" alias="serializer" />

        <service id="serializer.property_accessor" alias="property_accessor" />

        <!-- Normalizer -->
        <service id="serializer.normalizer.object" class="Symfony\Component\Serializer\Normalizer\ObjectNormalizer">
            <argument type="service" id="serializer.mapping.class_metadata_factory" />
            <argument>null</argument> <!-- name converter -->
            <argument type="service" id="serializer.property_accessor" />
            <argument type="service" id="property_info" on-invalid="ignore" />

            <!-- Run after all custom normalizers -->
            <tag name="serializer.normalizer" priority="-1000" />
        </service>
        <service id="Symfony\Component\Serializer\Normalizer\ObjectNormalizer" alias="serializer.normalizer.object" />

        <service id="serializer.denormalizer.array" class="Symfony\Component\Serializer\Normalizer\ArrayDenormalizer">
            <!-- Run before the object normalizer -->
            <tag name="serializer.normalizer" priority="-990" />
        </service>

        <!-- Loader -->
        <service id="serializer.mapping.chain_loader" class="Symfony\Component\Serializer\Mapping\Loader\LoaderChain">
            <argument type="collection" />
        </service>

        <!-- Class Metadata Factory -->
        <service id="serializer.mapping.class_metadata_factory" class="Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory">
            <argument type="service" id="serializer.mapping.chain_loader" />
            <argument>null</argument>
        </service>

        <!-- Cache -->
        <service id="serializer.mapping.cache_warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\SerializerCacheWarmer">
            <argument type="collection" /><!-- Loaders injected by the extension -->
            <argument>%serializer.mapping.cache.file%</argument>
            <argument type="service" id="cache.serializer" />
            <tag name="kernel.cache_warmer" />
        </service>

        <service id="serializer.mapping.cache.symfony" class="Symfony\Component\Cache\Adapter\PhpArrayAdapter" public="true">
            <factory class="Symfony\Component\Cache\Adapter\PhpArrayAdapter" method="create" />
            <argument>%serializer.mapping.cache.file%</argument>
            <argument type="service" id="cache.serializer" />
        </service>

        <service id="serializer.mapping.cache.doctrine.apc" class="Doctrine\Common\Cache\ApcCache">
            <call method="setNamespace">
                <argument>%serializer.mapping.cache.prefix%</argument>
            </call>
            <deprecated>The "%service_id%" service is deprecated since Symfony 3.2 and will be removed in 4.0. APCu should now be automatically used when available.</deprecated>
        </service>

        <service id="serializer.mapping.cache.apc" parent="serializer.mapping.cache.doctrine.apc" public="false">
            <deprecated>The "%service_id%" service is deprecated since Symfony 3.1 and will be removed in 4.0. APCu should now be automatically used when available.</deprecated>
        </service>

        <!-- Encoders -->
        <service id="serializer.encoder.xml" class="Symfony\Component\Serializer\Encoder\XmlEncoder">
            <tag name="serializer.encoder" />
        </service>

        <service id="serializer.encoder.json" class="Symfony\Component\Serializer\Encoder\JsonEncoder">
            <tag name="serializer.encoder" />
        </service>

        <!-- Name converter -->
        <service id="serializer.name_converter.camel_case_to_snake_case" class="Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter" />

        <!-- PropertyInfo extractor -->
        <service id="property_info.serializer_extractor" class="Symfony\Component\PropertyInfo\Extractor\SerializerExtractor">
            <argument type="service" id="serializer.mapping.class_metadata_factory" />

            <tag name="property_info.list_extractor" priority="-999" />
        </service>
    </services>
</container>
