El componente Serializer

El componente Serializer se pretende sea utilizado para convertir objetos a un formato específico (XML, JSON, Yaml, ...) y a la inversa.

Para ello, el componente Serializer sigue el siguiente sencillo esquema.

../_images/serializer_workflow.png

Como puedes ver en la imagen anterior, se utiliza un arreglo como un hombre en el medio. De este modo, los codificadores sólo tratarán convirtiendo formatos específicos en arreglos y viceversa. Del mismo modo, los normalizadores tratarán cambiando objetos específicos en arreglos y viceversa.

La serialización es un tema complicado, y a pesar de que este componente no puede trabajar en todos los casos, puede ser una útil herramienta mientras desarrollas herramientas para serializar y deserializar tus objetos.

Instalando

Puedes instalar el componente de varias maneras diferentes:

Usando

Utilizar el componente Serializer es realmente sencillo. Sólo necesitas instalar la clase Symfony\Component\Serializer\Serializer especificando qué codificadores y normalizadores van a estar disponibles:

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

$encoders = array(new XmlEncoder(), new JsonEncoder());
$normalizers = array(new GetSetMethodNormalizer());

$serializer = new Serializer($normalizers, $encoders);

Serializando un objeto

Por el bien de este ejemplo, supongamos que la siguiente clase ya existe en tu proyecto:

namespace Acme;

class Person
{
    private $age;
    private $name;

    // Captadores
    public function getName()
    {
        return $this->name;
    }

    public function getAge()
    {
        return $this->age;
    }

    // Definidores
    public function setName($name)
    {
        $this->name = $name;
    }

    public function setAge($age)
    {
        $this->age = $age;
    }
}

Ahora, si queremos serializar este objeto a JSON, sólo necesitamos utilizar el servicio Serializer creado anteriormente:

$person = new Acme\Person();
$person->setName('foo');
$person->setAge(99);

$jsonContent = $serializer->serialize($person, 'json');

// $jsonContent contains {"name":"foo","age":99}

echo $jsonContent; // or return it in a Response

El primer argumento del método serialize() es el objeto a serializar y el segundo suele escoger el codificador apropiado, en este caso Symfony\Component\Serializer\Encoder\JsonEncoder.

Deserializando un Objeto

Ahora veremos cómo hacer exactamente lo opuesto. Esta vez, la información de la clase Personas estaría codificada en formato XML:

$data = <<<EOF
<person>
    <name>foo</name>
    <age>99</age>
</person>
EOF;

$person = $serializer->deserialize($data,'Acme\Person','xml');

En este caso, el método deserialize() necesita tres argumentos:

  1. La información a descodificar
  2. El nombre de la clase a la que esta información será descodificada
  3. El codificador a utilizar para convertir esa información a un arreglo

JMSSerializer

Una popular biblioteca de terceros, JMS serializer, proporciona una solución más sofisticada aunque más compleja. Esta biblioteca incluye la habilidad para configurar cómo se deberían serializar/deserializar tus objetos a través de anotaciones (así como YML, XML y PHP), integrarlos con el ORM de Doctrine, y manejar otros casos complejos (p. ej. en referencias circulares).

Bifúrcame en GitHub