【问题标题】:Symfony2: Times out w/ JMS Serializer nested objectSymfony2:使用 JMS 序列化器嵌套对象超时
【发布时间】:2013-12-26 20:05:06
【问题描述】:

尝试序列化具有 3 个嵌套对象属性的对象会导致

错误:达到“250”的最大函数嵌套级别

Entity Volunteer 的 OneToOne with Person、OnetoMany with Focuses 和 OneToMany with Skills。如果响应是序列化的$volunteer->getPerson();,则会出现预期的 json 响应。但是,$volunteer->getFocuses(); 也会触发最大嵌套级别错误。

更新

当 xdebug max 增加时,这在开发环境中会在 30 秒内超时。

控制器sn-p:

$em = $this->getDoctrine()->getManager();
$serializer = \JMS\Serializer\SerializerBuilder::create()->build();
$volunteer = $em->getRepository('HOTV2Bundle:Volunteer')->find($id);
$response = new JsonResponse($serializer->serialize($volunteer, 'json'));

【问题讨论】:

  • @MKhalidJunaid:谢谢,但我不知道 xdebug 会如何影响序列化程序。
  • 我猜这是因为您启用了 xdebug ,如果是这种情况,请尝试增加 php.ini 中的限制
  • @MKhalidJunaid:啊,症状,而不是疾病。通过提高最大值或完全从 php.ini 中删除 xdebug 引用,脚本在 dev 中会在 30 秒时超时。所以现在我看到了 xdebug 如何影响性能,但是用嵌套对象序列化对象的原始问题仍未解决。

标签: json symfony jmsserializerbundle


【解决方案1】:

您的最大嵌套级别问题表明您正在尝试序列化比您需要的更多。

指定要使用 JMS 实体配置(注释、xml 或 yml)序列化的字段。我使用注释。我总是先用@ExclusionPolicy("all") 注释我的实体/文档,然后明确地@Expose 属性和关系。

@Accessor 和 @VirtualProperty 方法注释对于自定义输出非常有用。除了将相关的焦点序列化为对象之外,您还可以使用 @VirtualProperty 注释 getFocusTitles 方法来序列化一个简单的标题数组,如果这就是您所需要的。

当然,您需要像上面那样注释相关实体。

【讨论】:

  • 您的贡献受到赞赏,可能会派上用场 - 它已得到回报。此后我进行了重大的重新设计,不再尝试序列化该实体。
【解决方案2】:

这是一条 xdebug 错误消息。这意味着您拥有调用自身超过 250 次的递归函数。

您应该增加 php.ini 中的嵌套级别。

xdebug.max_nesting_level = 1000

否则您可以在脚本中设置嵌套级别

ini_set('xdebug.max_nesting_level', 1000)

【讨论】:

  • 谢谢。即使使用大大扩展的 xdebug 嵌套级别,序列化程序似乎也无法理解我的模型中的所有关系,这就是它超时的原因。我已经构建了一个函数来构建一个模仿我正在寻找的结构的数组。然后数组被完美序列化。
  • 当您在 php.ini 中禁用 xdebug 时,它会运行吗?你确定嵌套级别真的超过 250 吗?
  • 引用我友好的邻居phpinfo();xdebug.max_nesting_level 1000
【解决方案3】:

假设存在无限递归尝试序列化实体,我构建了以下可以序列化的数组。该函数接受一个 Volunteer 对象作为其参数。

public function createVolunteerArray($vol) {
    $p = $vol->getPerson();
    $person = array(
        'id' => $p->getId(),
        'firstName' => $p->getFirstName(),
        'lastName' => $p->getLastName(),
        'email' => $p->getEmail(),
        'address' => $p->getAddress(),
        'city' => $p->getCity(),
        'state' => $p->getState(),
        'zip' => $p->getZip(),
    );
    $f = $vol->getFocuses();
    $focusArray = array();
    foreach ($f as $foc) {
        $focus['id'] = $foc->getId();
        $focus['focus'] = $foc->getFocus();
        $focusArray[] = $focus;
    }
    $s = $vol->getSkills();
    $skillArray = array();
    foreach ($s as $sk) {
        $skill['id'] = $sk->getId();
        $skill['skill'] = $sk->getSkill();
        $skillArray[] = $skill;
    }
    $volunteer = array(
        'person' => $person,
        'focuses' => $focusArray,
        'skills' => $skillArray,
    );
    return $volunteer;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2020-09-08
    • 1970-01-01
    相关资源
    最近更新 更多