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.
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.
Puedes instalar el componente de varias maneras diferentes:
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);
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.
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:
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).