0

我一直在使用 "jms/serializer": "0.13.*@dev" 来序列化我的对象。

我在 Zend Framework (2) 和 Doctrine 项目中使用它。

这是我的代码:

use JMS\Serializer\SerializerBuilder as SerializerBuilder;
(....)

public function getList() {

    $em = $this->getEntityManager();
    $repo = $em->getRepository('MyApp\Entity\Product');
    $hydrator = new DoctrineHydrator($em);

    $data = array();
    foreach ($repo->findAll() as $found) {
        $data[] = $hydrator->extract($found);
    }
    $serializer = SerializerBuilder::create()->build();
    $jsonContent = $serializer->serialize($data, 'json');

    $this->getResponseWithHeader()->setStatusCode(self::OK_200);


    return new JsonModel($jsonContent);
}

但我收到此错误:

序列化数据不支持资源。路径:MyApp\Entity\FOO -> Doctrine\ORM\PersistentCollection -> MyApp\Entity\Product -> Doctrine\ORM\PersistentCollection -> DoctrineORMModule\Proxy__CG__\MyApp\MyApp\Brand

显然你不能序列化持久性集合。

我搜索了一下,发现了这个Symfony 相关问题。但是如何在独立的 Serializer 库中解决这个问题呢?

非常感谢。


编辑

这与 JMS 注释有什么关系吗?我应该使用某些注释来使其正常工作吗?

4

1 回答 1

1

我猜这里的问题是 PersistentCollection 可能包含对数据库连接的引用,因此 JMS 无法处理 Resource 类型。

如果您只想序列化第一级,那么我想您可以像这样破解它:

foreach ($repo->findAll() as $found) {
    // Set these to basically empty arrays
    $found->setRelation1(new \Doctrine\Common\Collections\ArrayCollection);
    $found->setRelation2(new \Doctrine\Common\Collections\ArrayCollection);
    $data[] = $hydrator->extract($found);
}

或者您可以扩展 JMS 序列化函数以忽略资源集合而不是抛出异常。

于 2013-08-04T12:11:25.250 回答