JMS 序列化程序无法处理序列化循环
JMS Serializer unable to handle serialization loop
昨晚,我的网络应用死机了,返回给用户的是白屏。没过多久就找到了根本原因:PHP
是 运行 内存不足。
追查问题后,我断定JMS Serializer
未能处理序列化循环。
我有 class ProductGroup
,其中有 Product
个对象(列表)。现在,每个 Product
指的是它所属的一个组。因此,当用户尝试序列化 ProductGroup
时,它会这样做,然后在跳回 ProductGroup
(刚刚序列化)时继续序列化每个 Product
,从而有效地创建一个序列化循环。
我设法解决了这个问题,但将 @Exclude
放在 Product::group
属性 上。
所以,问题是:关于序列化,我还有其他选择吗? JMS Serializer
是否有可能无法找出循环?
您可以尝试在 ProductGroup->products 和 Product->group 上设置 MaxDepth
以确保它不会进入循环。此外,将您的方法与组 + 产品和产品 + 组的不同序列化组一起使用可以缓解这种情况,并确保您在获取单个产品时仍然可以拥有关联的组。
关于你的第二个问题,在 Doctrine 中甚至不鼓励在两个方向上都有引用,所以 JMS\Serializer 抛出某种异常而不是尝试 "fix" 这似乎是预期的行为。
昨晚,我的网络应用死机了,返回给用户的是白屏。没过多久就找到了根本原因:PHP
是 运行 内存不足。
追查问题后,我断定JMS Serializer
未能处理序列化循环。
我有 class ProductGroup
,其中有 Product
个对象(列表)。现在,每个 Product
指的是它所属的一个组。因此,当用户尝试序列化 ProductGroup
时,它会这样做,然后在跳回 ProductGroup
(刚刚序列化)时继续序列化每个 Product
,从而有效地创建一个序列化循环。
我设法解决了这个问题,但将 @Exclude
放在 Product::group
属性 上。
所以,问题是:关于序列化,我还有其他选择吗? JMS Serializer
是否有可能无法找出循环?
您可以尝试在 ProductGroup->products 和 Product->group 上设置 MaxDepth
以确保它不会进入循环。此外,将您的方法与组 + 产品和产品 + 组的不同序列化组一起使用可以缓解这种情况,并确保您在获取单个产品时仍然可以拥有关联的组。
关于你的第二个问题,在 Doctrine 中甚至不鼓励在两个方向上都有引用,所以 JMS\Serializer 抛出某种异常而不是尝试 "fix" 这似乎是预期的行为。