昨晚,我的web应用程序死机了,给用户返回白屏。没有花很长时间就找到了根本原因:PHP
内存不足。
跟踪问题后,我得出结论,JMS Serializer
未能处理序列化循环。
我有类ProductGroup
,它有Product
对象的数量(列表)。现在,每个Product
都指向它所属的一个组。因此,当用户尝试序列化ProductGroup
时,它会这样做,然后在跳转到ProductGroup
(刚刚序列化过)时继续序列化每个Product
,从而有效地创建了一个序列化循环。
我设法解决了这个问题,但把@Exclude
放在Product::group
属性上。
所以,问题是:当涉及到序列化时,我还有其他选择吗?是否有可能JMS Serializer
无法找出循环?
您可以尝试在ProductGroup->products和Product->group上设置MaxDepth
,以确保它不会进入循环。此外,对组+产品和产品+组的不同序列化组使用您的方法可以缓解这种情况,并确保在获取单个产品时仍然可以拥有关联的组。
关于你的第二个问题,在原则中甚至不鼓励在两个方向上都有引用,所以JMSSerializer抛出某种异常而不是试图"修复"它似乎是预期的行为。