Ruby on rails rails 3.2.2无法反序列化序列化模型对象-行为奇怪

Ruby on rails rails 3.2.2无法反序列化序列化模型对象-行为奇怪,ruby-on-rails,activerecord,deserialization,Ruby On Rails,Activerecord,Deserialization,我为这个冗长/复杂的问题道歉 使用rails 3.2.2(ruby 1.9.3-p194),我们使用会话存储的Dalli/memcached将特定于用户的ActiveRecord模型对象保存到会话中,在开发过程中,我们有时会在从会话检索数据时看到错误: ArgumentError (Unable to unmarshal value: dump format error for symbol(0x46)): 通常,当数据有问题时(例如,对象有一个外键指向不存在的记录),就会发生错误 然而,每当

我为这个冗长/复杂的问题道歉

使用rails 3.2.2(ruby 1.9.3-p194),我们使用会话存储的Dalli/memcached将特定于用户的ActiveRecord模型对象保存到会话中,在开发过程中,我们有时会在从会话检索数据时看到错误:

ArgumentError (Unable to unmarshal value: dump format error for symbol(0x46)):
通常,当数据有问题时(例如,对象有一个外键指向不存在的记录),就会发生错误

然而,每当我们添加或删除涉及多对多关联的记录时,我们仍然会遇到这个错误,即使所有外键都有效,而且一切似乎都是正确的(在清除数据库、杀死rails和memcache服务器等之后)

多对多关联是通过连接表实现的,并且具有多通性。我们模式的高度简化视图为:

  User
   |
 Profile
  |  \
  .   \
  .    \
  .     \
  |      \
 Foo ==== Bar
当用户有多个配置文件时,配置文件有多个foo(间接地,通过其他表),配置文件有多个条,foo和条通过BarFoo连接表彼此有多个

该错误通常在向条形图添加或从条形图中删除Foo时触发。虽然我们在从会话检索时就意识到了这一点,但这不应归咎于会话/memcache本身,因为即使在会话中存储数据之前,错误也可能发生

为了消除等式中的会话,我在创建/删除Foo/Bar记录之后插入了以下代码:

Marshal.load(Marshal.dump(user)) # throws exception first time
这会引发异常。真正令人费解的是:如果我捕捉到异常以便继续处理请求,那么用户对象实际上存储在会话中,并将在会话之后毫无问题地获取。(我发现了这一点,因为在调试断点期间,运行上述代码一次失败,然后立即再次运行它成功,并在继续执行时“修复”了问题。)

更奇怪的是,如果在Foo/Bar创建/删除后立即执行以下操作,而不是上述代码:

Marshal.load(Marshal.dump(profile)) # does not throw any exception
我没有得到任何异常,其余的代码都可以工作(用户在会话中被存储和检索,没有错误)

我读过很多讨论,这些讨论似乎认为AR模型实例不应该被缓存,因为它们可能包含PROC、IO等。然而,我们在转储对象时没有遇到类型错误。通过在用户模型上运行两次序列化/反序列化或在其子模型上运行一次来“纠正”问题的事实非常令人费解。一个对象的序列化表示如何在某一时刻无效,而在下一时刻有效

有人能告诉我这是rails中的一个bug吗?或者我们正在做一些不受支持的事情?有没有办法将模型对象与其关联的模型序列化,或者我必须为模型对象及其关联实现自己的序列化/反序列化代码

更新:此错误不限于多对多关联。在模式中创建/更新/删除其他表时也会发生这种情况,但在这些情况下,这种情况更为罕见,几乎不可能重现