【问题标题】:Serializing and Deserializing in SymfonySymfony 中的序列化和反序列化
【发布时间】:2026-01-09 16:40:01
【问题描述】:

我正在使用 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;
}

}

不太确定我错过了什么,非常感谢任何帮助。

【问题讨论】:

  • symfony 序列化程序非常有限。请查看JMS/serializer。它更强大

标签: php json symfony serialization


【解决方案1】:

Symfony 的序列化器组件真的很有趣(我不再使用 JMS 序列化器了……)

您唯一需要配置的是:规范化器

规范化器是使用标签注册的简单服务。

有一些内置类,例如:

  • Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer : 使用 getter 和 setter 来(反)规范化
  • Symfony\Component\Serializer\Normalizer\PropertyNormalizer :使用反射来(反)规范化
  • Symfony\Component\Serializer\Normalizer\CustomNormalizer :为您提供一种以编程方式定义规范化行为的方法

对于您的情况,只需注册此服务:

<service id="app.normalizer.get_set" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer">
    <tag name="serializer.normalizer" priority="0" />
</service>

一切准备就绪

【讨论】:

    【解决方案2】:

    deserialize() 应该获取实体的命名空间,因此您需要更改 AppBundle:EntityAppBundle\Entity

    $person = $serializer->deserialize($jsonContent, 'AppBundle\Entity', 'json');
    

    【讨论】:

    • 好地方,但恐怕没有运气,我相信这可能与实体类有关,嗯..
    【解决方案3】:

    反序列化器类型应该是包含实体名称的命名空间,由两个反斜杠分隔:

    $person = $serializer->deserialize($jsonContent, 'AppBundle\\Entity', 'json');
    

    【讨论】:

      最近更新 更多