我使用Symfony包“symfony / serializer”序列化实体。
我能够将我的实体编码成json而没有任何问题,但是我遇到了反序列化并将其恢复到原始形式的问题。我收到的错误是;
Could not denormalize object of type AppBundle:Entity, no supporting normalizer found.
DefaultController.php
//Create Entity to Serialize
$entity = new Entity();
$entity->setId(1);
$entity->setName('john');
//create serializer to serialize entity
$encoders = array(new XmlEncoder(), new JsonEncoder());
$normalizers = array(new ObjectNormalizer());
$serializer = new Serializer($normalizers, $encoders);
$jsonContent = $serializer->serialize($entity, 'json');
var_dump($jsonContent); // returns string '{"id":1,"name":"john"}' (length=22) << GOOD!
//Deserialize entity
$person = $serializer->deserialize($jsonContent, 'AppBundle:Entity', 'json');
//<ERROR HERE>//
var_dump($person);
Entity.php
namespace AppBundle\Entity;
class Entity {
private $id;
private $name;
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
不太确定我缺少什么,非常感谢任何帮助。
答案 0 :(得分:3)
Symfony的序列化程序组件非常有趣(我不再使用JMS Serializer了......)
您唯一需要配置的是:规范化器
规范化器是使用标签注册的简单服务。
有一些内置类,如:
Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
:使用getter和setter(de)normalize Symfony\Component\Serializer\Normalizer\PropertyNormalizer
:使用反射来(de)normalize Symfony\Component\Serializer\Normalizer\CustomNormalizer
:为您提供一种方法来定义您的规范化行为对于您的情况,只需注册此服务:
<service id="app.normalizer.get_set" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer">
<tag name="serializer.normalizer" priority="0" />
</service>
你已经完成了
答案 1 :(得分:0)
deserialize()应该获取实体的名称空间,因此您需要更改
AppBundle:Entity
至AppBundle\Entity
。
$person = $serializer->deserialize($jsonContent, 'AppBundle\Entity', 'json');
答案 2 :(得分:0)
反序列化器类型应该是名称空间,包括由两个反斜杠分隔的实体名称:
$person = $serializer->deserialize($jsonContent, 'AppBundle\\Entity', 'json');