From dbdbf68deb7186354fc214f01c37173d6be95b95 Mon Sep 17 00:00:00 2001 From: Ener-Getick Date: Sun, 26 Jun 2016 11:08:10 +0200 Subject: [PATCH 1/5] [Serializer] Document the encoders --- components/index.rst | 2 +- components/map.rst.inc | 5 +- components/serializer/encoders.rst | 63 ++++++++++++ components/serializer/index.rst | 8 ++ .../introduction.rst} | 14 ++- cookbook/index.rst | 2 +- cookbook/map.rst.inc | 5 +- cookbook/serializer/custom_encoders.rst | 97 +++++++++++++++++++ cookbook/serializer/index.rst | 8 ++ .../introduction.rst} | 6 +- redirection_map | 2 + reference/dic_tags.rst | 4 +- 12 files changed, 200 insertions(+), 16 deletions(-) create mode 100644 components/serializer/encoders.rst create mode 100644 components/serializer/index.rst rename components/{serializer.rst => serializer/introduction.rst} (98%) create mode 100644 cookbook/serializer/custom_encoders.rst create mode 100644 cookbook/serializer/index.rst rename cookbook/{serializer.rst => serializer/introduction.rst} (98%) diff --git a/components/index.rst b/components/index.rst index 43aa14e5e40..8f8cdc08f35 100644 --- a/components/index.rst +++ b/components/index.rst @@ -28,7 +28,7 @@ The Components property_access/index routing/index security/index - serializer + serializer/index stopwatch templating/index translation/index diff --git a/components/map.rst.inc b/components/map.rst.inc index ee9c34ba884..a7dd126cb9b 100644 --- a/components/map.rst.inc +++ b/components/map.rst.inc @@ -140,9 +140,10 @@ * :doc:`/components/security/authorization` * :doc:`/components/security/secure_tools` -* **Serializer** +* :doc:`/components/serializer/index` - * :doc:`/components/serializer` + * :doc:`/components/serializer/introduction` + * :doc:`/components/serializer/encoders` * **Stopwatch** diff --git a/components/serializer/encoders.rst b/components/serializer/encoders.rst new file mode 100644 index 00000000000..9b268273d35 --- /dev/null +++ b/components/serializer/encoders.rst @@ -0,0 +1,63 @@ +.. index:: + single: Serializer, Encoders + +Encoders +======== + +Encoders basically turn **arrays** into **formats** and vice versa. +They implement +:class:`Symfony\\Component\\Serializer\\Encoder\\EncoderInterface` for +encoding (array to format) and +:class:`Symfony\\Component\\Serializer\\Encoder\\DecoderInterface` for +decoding (format to array). + +You can add new encoders to a Serializer instance by using its second constructor argument:: + + use Symfony\Component\Serializer\Serializer; + use Symfony\Component\Serializer\Encoder\XmlEncoder; + use Symfony\Component\Serializer\Encoder\JsonEncoder; + + $encoders = array(new XmlEncoder(), new JsonEncoder()); + $serializer = new Serializer(array(), $encoders); + +Built-in Encoders +----------------- + +Two encoders are used in the example above: + +* :class:`Symfony\\Component\\Serializer\\Encoder\\XmlEncoder` to encode/decode XML +* :class:`Symfony\\Component\\Serializer\\Encoder\\JsonEncoder` to encode/decode JSON + +The ``XmlEncoder`` +~~~~~~~~~~~~~~~~~~ + +This encoder transforms arrays into XML and vice versa. + +For example, take an object normalized as following:: + + array('foo' => array(1, 2), 'bar' => true); + +The ``XmlEncoder`` will encode this object like that:: + + + + 1 + 2 + 1 + + +Be aware that this encoder will consider keys beginning with ``@`` as attributes:: + + $encoder = new XmlEncoder(); + $encoder->encode(array('foo' => array('@bar' => 'value'))); + // will return: + // + // + // + // + +The ``JsonEncoder`` +~~~~~~~~~~~~~~~~~~~ + +The ``JsonEncoder`` is much simpler and is based on the PHP +:phpfunction:`json_encode` and :phpfunction:`json_decode` functions. diff --git a/components/serializer/index.rst b/components/serializer/index.rst new file mode 100644 index 00000000000..d2493f383ed --- /dev/null +++ b/components/serializer/index.rst @@ -0,0 +1,8 @@ +Serializer +========== + +.. toctree:: + :maxdepth: 2 + + introduction + encoders diff --git a/components/serializer.rst b/components/serializer/introduction.rst similarity index 98% rename from components/serializer.rst rename to components/serializer/introduction.rst index c8354d9713e..d67bcbdaca0 100644 --- a/components/serializer.rst +++ b/components/serializer/introduction.rst @@ -44,7 +44,7 @@ Usage Using the Serializer component is really simple. You just need to set up the :class:`Symfony\\Component\\Serializer\\Serializer` specifying -which Encoders and Normalizer are going to be available:: +which encoders and normalizers are going to be available:: use Symfony\Component\Serializer\Serializer; use Symfony\Component\Serializer\Encoder\XmlEncoder; @@ -57,10 +57,14 @@ which Encoders and Normalizer are going to be available:: $serializer = new Serializer($normalizers, $encoders); The preferred normalizer is the -:class:`Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer`, but other -normalizers are available. -To read more about them, refer to the `Normalizers`_ section of this page. All -the examples shown below use the ``ObjectNormalizer``. +:class:`Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer`, +but other normalizers are available. All the examples shown below use +the ``ObjectNormalizer``. + +.. seealso:: + + Read the dedicated sections to learn more about :doc:`/components/serializer/encoders` + and `Normalizers`_. Serializing an Object --------------------- diff --git a/cookbook/index.rst b/cookbook/index.rst index f6ee4386b87..687e9fb7933 100644 --- a/cookbook/index.rst +++ b/cookbook/index.rst @@ -26,7 +26,7 @@ The Cookbook request/index routing/index security/index - serializer + serializer/index service_container/index session/index symfony1 diff --git a/cookbook/map.rst.inc b/cookbook/map.rst.inc index bbef8f68661..207ab5c1334 100644 --- a/cookbook/map.rst.inc +++ b/cookbook/map.rst.inc @@ -187,9 +187,10 @@ * :doc:`/cookbook/security/securing_services` * :doc:`/cookbook/security/access_control` -* **Serializer** +* :doc:`/cookbook/serializer/index` - * :doc:`/cookbook/serializer` + * :doc:`/cookbook/serializer/introduction` + * :doc:`/cookbook/serializer/custom_encoders` * :doc:`/cookbook/service_container/index` diff --git a/cookbook/serializer/custom_encoders.rst b/cookbook/serializer/custom_encoders.rst new file mode 100644 index 00000000000..5cacea05984 --- /dev/null +++ b/cookbook/serializer/custom_encoders.rst @@ -0,0 +1,97 @@ +.. index:: + single: Serializer; Custom encoders + +How to Create your Custom Encoder +================================= + +The :doc:`Serializer Component ` uses Normalizers +to transform any data to an array that can be then converted in whatever +data-structured language you want thanks to Encoders. + +The Component provides several built-in encoders that are described +:doc:`in their own section ` but you may want +to use another language not supported. + +Creating a new encoder +---------------------- + +Imagine you want to serialize and deserialize Yaml. For that you'll have to +create your own encoder that may use the +:doc:`Yaml Component `:: + + namespace AppBundle\Encoder; + + use Symfony\Component\Serializer\Encoder\DecoderInterface; + use Symfony\Component\Serializer\Encoder\EncoderInterface; + use Symfony\Component\Yaml\Yaml; + + class YamlEncoder implements EncoderInterface, DecoderInterface + { + public function encode($data, $format, array $context = array()) + { + return Yaml::dump($data); + } + + public function supportsEncoding($format) + { + return 'yaml' === $format; + } + + public function decode($data, $format, array $context = array()) + { + return Yaml::parse($data); + } + + public function supportsDecoding($format) + { + return 'yaml' === $format; + } + } + +Registering it in your app +-------------------------- + +If you use the Symfony Framework then you probably want to register this encoder +as a service in your app. Then you only need to tag it as `serializer.encoder` and it will be +injected in the Serializer. + +.. configuration-block:: + + .. code-block:: yaml + + # app/config/services.yml + services: + app.encoder.yaml: + class: AppBundle\Encoder\YamlEncoder + tags: + - { name: serializer.encoder } + + .. code-block:: xml + + + + + + + + + + + + + .. code-block:: php + + // app/config/services.php + $container + ->register( + 'app.encoder.yaml', + 'AppBundle\Encoder\YamlEncoder' + ) + ->addTag('serializer.encoder') + ; + +Now you'll be able to serialize and deserialize Yaml! + +.. _tracker: https://github.com/symfony/symfony/issues diff --git a/cookbook/serializer/index.rst b/cookbook/serializer/index.rst new file mode 100644 index 00000000000..7578be22c61 --- /dev/null +++ b/cookbook/serializer/index.rst @@ -0,0 +1,8 @@ +Serializer +========== + +.. toctree:: + :maxdepth: 2 + + introduction + custom_encoders diff --git a/cookbook/serializer.rst b/cookbook/serializer/introduction.rst similarity index 98% rename from cookbook/serializer.rst rename to cookbook/serializer/introduction.rst index 00e8d70f939..74d9cb77183 100644 --- a/cookbook/serializer.rst +++ b/cookbook/serializer/introduction.rst @@ -1,16 +1,16 @@ .. index:: - single: Serializer + single: Serializer; Introduction 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 -:doc:`Serializer Component `, which gives you some +:doc:`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 :doc:`Serializer Component `. +and encoders by reading the :doc:`Serializer Component `. Activating the Serializer ------------------------- diff --git a/redirection_map b/redirection_map index faf3e0fd638..cfa75bed667 100644 --- a/redirection_map +++ b/redirection_map @@ -10,6 +10,7 @@ /cookbook/email /cookbook/email/email /cookbook/gmail /cookbook/email/gmail /cookbook/console /components/console +/cookbook/serializer /cookbook/serializer/introduction /cookbook/tools/autoloader /components/class_loader /cookbook/tools/finder /components/finder /cookbook/service_container/parentservices /components/dependency_injection/parentservices @@ -26,6 +27,7 @@ /components/yaml /components/yaml/introduction /components/templating /components/templating/introduction /components/filesystem /components/filesystem/introduction +/components/serializer /components/serializer/introduction /cmf/reference/configuration/block /cmf/bundles/block/configuration /cmf/reference/configuration/content /cmf/bundles/content/configuration /cmf/reference/configuration/core /cmf/bundles/core/configuration diff --git a/reference/dic_tags.rst b/reference/dic_tags.rst index 2d847f0a1aa..0dbaf95b312 100644 --- a/reference/dic_tags.rst +++ b/reference/dic_tags.rst @@ -946,7 +946,7 @@ serializer.encoder The class that's tagged should implement the :class:`Symfony\\Component\\Serializer\\Encoder\\EncoderInterface` and :class:`Symfony\\Component\\Serializer\\Encoder\\DecoderInterface`. -For more details, see :doc:`/cookbook/serializer`. +For more details, see :doc:`/cookbook/serializer/introduction`. .. _reference-dic-tags-serializer-normalizer: @@ -958,7 +958,7 @@ serializer.normalizer The class that's tagged should implement the :class:`Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface` and :class:`Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface`. -For more details, see :doc:`/cookbook/serializer`. +For more details, see :doc:`/cookbook/serializer/introduction`. swiftmailer.default.plugin -------------------------- From 33e5b768b3da3164472724877ee667c26c21b8d6 Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Sun, 18 Sep 2016 16:26:11 -0400 Subject: [PATCH 2/5] Moving files into the new structure --- .../{serializer/introduction.rst => serializer.rst} | 7 +------ components/serializer/index.rst | 8 -------- serializer.rst | 10 ++++++++-- .../serializer => serializer}/custom_encoders.rst | 0 {components/serializer => serializer}/encoders.rst | 0 5 files changed, 9 insertions(+), 16 deletions(-) rename components/{serializer/introduction.rst => serializer.rst} (99%) delete mode 100644 components/serializer/index.rst rename {cookbook/serializer => serializer}/custom_encoders.rst (100%) rename {components/serializer => serializer}/encoders.rst (100%) diff --git a/components/serializer/introduction.rst b/components/serializer.rst similarity index 99% rename from components/serializer/introduction.rst rename to components/serializer.rst index b704d1d3891..4d37c9d16d5 100644 --- a/components/serializer/introduction.rst +++ b/components/serializer.rst @@ -44,7 +44,7 @@ Usage Using the Serializer component is really simple. You just need to set up the :class:`Symfony\\Component\\Serializer\\Serializer` specifying -which encoders and normalizers are going to be available:: +which encoders and normalizer are going to be available:: use Symfony\Component\Serializer\Serializer; use Symfony\Component\Serializer\Encoder\XmlEncoder; @@ -61,11 +61,6 @@ The preferred normalizer is the but other normalizers are available. All the examples shown below use the ``ObjectNormalizer``. -.. seealso:: - - Read the dedicated sections to learn more about :doc:`/components/serializer/encoders` - and `Normalizers`_. - Serializing an Object --------------------- diff --git a/components/serializer/index.rst b/components/serializer/index.rst deleted file mode 100644 index d2493f383ed..00000000000 --- a/components/serializer/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -Serializer -========== - -.. toctree:: - :maxdepth: 2 - - introduction - encoders diff --git a/serializer.rst b/serializer.rst index 097a13cfcc5..005455f590a 100644 --- a/serializer.rst +++ b/serializer.rst @@ -226,8 +226,8 @@ A service leveraging `APCu`_ (and APC for PHP < 5.5) is built-in. ), )); -Going Further with the Serializer Component -------------------------------------------- +Going Further with the Serializer +--------------------------------- `ApiPlatform`_ provides an API system supporting `JSON-LD`_ and `Hydra Core Vocabulary`_ hypermedia formats. It is built on top of the Symfony Framework and its Serializer @@ -237,6 +237,12 @@ and a caching system. If you want to leverage the full power of the Symfony Serializer component, take a look at how this bundle works. +.. toctree:: + :maxdepth: 1 + :glob: + + serializer/* + .. _`APCu`: https://github.com/krakjoe/apcu .. _`ApiPlatform`: https://github.com/api-platform/core .. _`JSON-LD`: http://json-ld.org diff --git a/cookbook/serializer/custom_encoders.rst b/serializer/custom_encoders.rst similarity index 100% rename from cookbook/serializer/custom_encoders.rst rename to serializer/custom_encoders.rst diff --git a/components/serializer/encoders.rst b/serializer/encoders.rst similarity index 100% rename from components/serializer/encoders.rst rename to serializer/encoders.rst From 73172c6d6e7366e300d33a9cd138b48a130ea1d6 Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Sun, 18 Sep 2016 16:31:55 -0400 Subject: [PATCH 3/5] updating links --- serializer/custom_encoders.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/serializer/custom_encoders.rst b/serializer/custom_encoders.rst index 5cacea05984..4991b41fbf7 100644 --- a/serializer/custom_encoders.rst +++ b/serializer/custom_encoders.rst @@ -4,12 +4,12 @@ How to Create your Custom Encoder ================================= -The :doc:`Serializer Component ` uses Normalizers +The :doc:`Serializer Component ` uses Normalizers to transform any data to an array that can be then converted in whatever data-structured language you want thanks to Encoders. The Component provides several built-in encoders that are described -:doc:`in their own section ` but you may want +:doc:`in their own section ` but you may want to use another language not supported. Creating a new encoder @@ -17,7 +17,7 @@ Creating a new encoder Imagine you want to serialize and deserialize Yaml. For that you'll have to create your own encoder that may use the -:doc:`Yaml Component `:: +:doc:`Yaml Component `:: namespace AppBundle\Encoder; From f99663a3ee5842f2ebd600d7dec52b1ff9783d4f Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Sun, 18 Sep 2016 16:32:36 -0400 Subject: [PATCH 4/5] removing cookbook entries --- cookbook/serializer/index.rst | 8 - cookbook/serializer/introduction.rst | 241 --------------------------- 2 files changed, 249 deletions(-) delete mode 100644 cookbook/serializer/index.rst delete mode 100644 cookbook/serializer/introduction.rst diff --git a/cookbook/serializer/index.rst b/cookbook/serializer/index.rst deleted file mode 100644 index 7578be22c61..00000000000 --- a/cookbook/serializer/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -Serializer -========== - -.. toctree:: - :maxdepth: 2 - - introduction - custom_encoders diff --git a/cookbook/serializer/introduction.rst b/cookbook/serializer/introduction.rst deleted file mode 100644 index 74d9cb77183..00000000000 --- a/cookbook/serializer/introduction.rst +++ /dev/null @@ -1,241 +0,0 @@ -.. index:: - single: Serializer; Introduction - -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 -:doc:`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 :doc:`Serializer Component `. - -Activating the Serializer -------------------------- - -.. versionadded:: 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: - -.. configuration-block:: - - .. code-block:: yaml - - # app/config/config.yml - framework: - # ... - serializer: - enabled: true - - .. code-block:: xml - - - - - - - - .. code-block:: php - - // app/config/config.php - $container->loadFromExtension('framework', array( - // ... - 'serializer' => array( - 'enabled' => true, - ), - )); - -Using the Serializer Service ----------------------------- - -Once enabled, the ``serializer`` service can be injected in any service where -you need it or it can be used in a controller like the following:: - - // src/AppBundle/Controller/DefaultController.php - namespace AppBundle\Controller; - - use Symfony\Bundle\FrameworkBundle\Controller\Controller; - - class DefaultController extends Controller - { - public function indexAction() - { - $serializer = $this->get('serializer'); - - // ... - } - } - -Adding Normalizers and Encoders -------------------------------- - -.. versionadded:: 2.7 - The :class:`Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer` - is enabled by default in Symfony 2.7. In prior versions, you needed to load - your own normalizer. - -Once enabled, the ``serializer`` service will be available in the container -and will be loaded with two :ref:`encoders ` -(:class:`Symfony\\Component\\Serializer\\Encoder\\JsonEncoder` and -:class:`Symfony\\Component\\Serializer\\Encoder\\XmlEncoder`) and the -:ref:`ObjectNormalizer normalizer `. - -You can load normalizers and/or encoders by tagging them as -:ref:`serializer.normalizer ` and -:ref:`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 -:class:`Symfony\\Component\\Serializer\\Normalizer\\GetSetMethodNormalizer`: - -.. configuration-block:: - - .. code-block:: yaml - - # app/config/services.yml - services: - get_set_method_normalizer: - class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer - tags: - - { name: serializer.normalizer } - - .. code-block:: xml - - - - - - - - - .. code-block:: php - - // app/config/services.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); - -.. _cookbook-serializer-using-serialization-groups-annotations: - -Using Serialization Groups Annotations --------------------------------------- - -.. versionadded:: 2.7 - Support for serialization groups was introduced in Symfony 2.7. - -Enable :ref:`serialization groups annotation ` -with the following configuration: - -.. configuration-block:: - - .. code-block:: yaml - - # app/config/config.yml - framework: - # ... - serializer: - enable_annotations: true - - .. code-block:: xml - - - - - - - - .. code-block:: php - - // app/config/config.php - $container->loadFromExtension('framework', array( - // ... - 'serializer' => array( - 'enable_annotations' => true, - ), - )); - -Next, add the :ref:`@Groups annotations ` -to your class and choose which groups to use when serializing:: - - $serializer = $this->get('serializer'); - $json = $serializer->serialize( - $someObject, - 'json', array('groups' => array('group1')) - ); - -In addition to the ``@Groups`` annotation, the Serializer component also -supports Yaml or XML files. These files are automatically loaded when being -stored in one of the following locations: - -* The ``serialization.yml`` or ``serialization.xml`` file in - the ``Resources/config/`` directory of a bundle; -* All ``*.yml`` and ``*.xml`` files in the ``Resources/config/serialization/`` - directory of a bundle. - -.. _cookbook-serializer-enabling-metadata-cache: - -Enabling the Metadata Cache ---------------------------- - -.. versionadded:: 2.7 - Serializer metadata and the ability to cache them were introduced in - Symfony 2.7. - -Metadata used by the Serializer component such as groups can be cached to -enhance application performance. Any service implementing the ``Doctrine\Common\Cache\Cache`` -interface can be used. - -A service leveraging `APCu`_ (and APC for PHP < 5.5) is built-in. - -.. configuration-block:: - - .. code-block:: yaml - - # app/config/config_prod.yml - framework: - # ... - serializer: - cache: serializer.mapping.cache.apc - - .. code-block:: xml - - - - - - - - .. code-block:: php - - // app/config/config_prod.php - $container->loadFromExtension('framework', array( - // ... - 'serializer' => array( - 'cache' => 'serializer.mapping.cache.apc', - ), - )); - -Going Further with the Serializer Component -------------------------------------------- - -`ApiPlatform`_ provides an API system supporting `JSON-LD`_ and `Hydra Core Vocabulary`_ -hypermedia formats. It is built on top of the Symfony Framework and its Serializer -component. It provides custom normalizers and a custom encoder, custom metadata -and a caching system. - -If you want to leverage the full power of the Symfony Serializer component, -take a look at how this bundle works. - -.. _`APCu`: https://github.com/krakjoe/apcu -.. _`ApiPlatform`: https://github.com/api-platform/core -.. _`JSON-LD`: http://json-ld.org -.. _`Hydra Core Vocabulary`: http://hydra-cg.com From 10b2fa33b6a734ee3624b685572fbe5824d97e67 Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Sun, 18 Sep 2016 16:37:27 -0400 Subject: [PATCH 5/5] Minor language tweaks --- serializer/custom_encoders.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/serializer/custom_encoders.rst b/serializer/custom_encoders.rst index 4991b41fbf7..7c573ec2527 100644 --- a/serializer/custom_encoders.rst +++ b/serializer/custom_encoders.rst @@ -5,18 +5,18 @@ How to Create your Custom Encoder ================================= The :doc:`Serializer Component ` uses Normalizers -to transform any data to an array that can be then converted in whatever -data-structured language you want thanks to Encoders. +to transform any data to an array. Then, by leveraging *Encoders*, that data can +be convereted into any data-structure (e.g. JSON). The Component provides several built-in encoders that are described :doc:`in their own section ` but you may want -to use another language not supported. +to use another structure that's not supported. Creating a new encoder ---------------------- Imagine you want to serialize and deserialize Yaml. For that you'll have to -create your own encoder that may use the +create your own encoder that uses the :doc:`Yaml Component `:: namespace AppBundle\Encoder; @@ -51,9 +51,9 @@ create your own encoder that may use the Registering it in your app -------------------------- -If you use the Symfony Framework then you probably want to register this encoder -as a service in your app. Then you only need to tag it as `serializer.encoder` and it will be -injected in the Serializer. +If you use the Symfony Framework. then you probably want to register this encoder +as a service in your app. Then, you only need to tag it with ``serializer.encoder`` +to inject your custom encoder into the Serializer. .. configuration-block::