Serialize/Deserialize XML in Symfony
Tags: serialize, deserialize, xml, symfony
Published: 2021-08-23 12:22:03

# What is a serializer?
A serializer is meant to convert an object to XML (serialize) or the other way around, convert XML to an object (deserialize).

This can also be done to JSON and other formats, therefor have a look at Symfony's [documentation](https://symfony.com/doc/current/components/serializer.html). There are third party serializers, such as [JML](https://jmsyst.com/libs/serializer/master/reference/annotations), but for now we will work with Symfony's default serializer.

## How to use Symfony's default serializer

### 1. Install the serializer by composer
```
composer require symfony/serializer
```

### 2. Create a Model (for demo reasons)
```
<?php

namespace App\Model;

class Person
{
    private $age;
    private $name;
    private $sportsperson;
    private $createdAt;

    // Getters

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @return mixed
     */
    public function getAge()
    {
        return $this->age;
    }

    /**
     * @return mixed
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    // Issers

    public function isSportsperson()
    {
        return $this->sportsperson;
    }

    /**
     * @param mixed $name
     */
    public function setName($name): void
    {
        $this->name = $name;
    }

    /**
     * @param mixed $age
     */
    public function setAge($age): void
    {
        $this->age = $age;
    }

    /**
     * @param mixed $sportsperson
     */
    public function setSportsperson($sportsperson): void
    {
        $this->sportsperson = $sportsperson;
    }

    /**
     * @param mixed $createdAt
     */
    public function setCreatedAt($createdAt): void
    {
        $this->createdAt = $createdAt;
    }


}
```

### 3. Create the SerializerController with a method called `serializeObject()`
```
<?php

namespace App\Controller;

use App\Model\Person;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;

class SerializerController
{

    protected $encoder;
    protected $normalizer;
    protected $serializer;
    protected $data;

    /**
     * @Route("/serialize-object", name="Serialize Object")
     */
    public function serializeObject()
    {
        $this->encoder      = [new XmlEncoder()];
        $this->normalizer   = [new ObjectNormalizer()];
        $this->serializer   = new Serializer($this->normalizer, $this->encoder);

        $person = new Person();
        $person->setName('foo');
        $person->setAge(99);
        $person->setSportsperson(false);

        $xmlContent = $this->serializer->serialize($person, 'xml');

        dd($xmlContent);
    }
}
```
#### Outcome
We created an object Person and serialized it to XML which results in a die and dump like this:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n5b59no4hetq7kkcaihr.png)

### 4. Add an other method `deserializeObject()` to deserialize XML to an object
```
/**
     * @Route("/deserialize-object", name="Deserialize Object")
     */
    public function deserializeObject()
    {
        $this->encoder      = [new XmlEncoder()];
        $this->normalizer   = [new ObjectNormalizer()];
        $this->serializer   = new Serializer($this->normalizer, $this->encoder);

        $this->data =   '<?xml version="1.0" encoding="UTF-8"?>
                         <Person>
                             <name>John Doe</name>
                             <age>88</age>
                             <sportsperson>true</sportsperson>
                         </Person>';

        $personObject = $this->serializer->deserialize($this->data, Person::class, 'xml');

        dd($personObject);
    }
```
### Outcome
This time we converted xml with a Person and some properties, this resulted in a die and dump as follows:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5oyatp8fh19ql4btqrv.png)


Thats all folks~