新手问题 active job 序列化 Marshal.dump 出来的字符串报错

Awlter1 · 2018年11月04日 · 最后由 Awlter1 回复于 2018年11月05日 · 1426 次阅读

Google 了一下

https://github.com/mperham/sidekiq/issues/3638

发现倒数第二楼好像有解决方法了,但是他的留言我实在是看不懂。。哪位朋友能看懂解释下么? :)

为什么不用 to_json 呢?

Marshal 一般来说是用来深拷贝的,例如

a = ["Monkey", "Brains"]

b = Marshal.load(Marshal.dump(a))
#=> ["Monkey", "Brains"]

b.each(&:upcase!)
#=> ["MONKEY", "BRAINS"]

a
#=> ["Monkey", "Brains"]

关于拷贝的更多说明

你的需求是序列化,用 to_json 就行了

这个问题我也遇到过,dump 出来的字符是二进制的,问题好像是 sidekiq 默认使用 ruby 的一个全局设置 Encoding::default_external(默认 utf-8) 来对 Redis 写入,然后就有问题了。

倒数二楼是让你自己写个子类去实现参数字符转换,然后把正确格式的参数传进 perform 这个方法。

@coderliu 我那个集合是个 mongoid 的 criteria,to_json 是把所有数据取出来再 json 化

@tuliang 我这里是为了拿 criteria

@weito 谢谢,具体能秀一下具体的代码吗?我司大神给了一个简便的方法,用 base64 处理下 dump 出来的字符串就行了

把查询对象存到外部再读回来?听起来很有问题,数据交互应该尽可能用简单的对象。

没用过 mongoid,不过看你描述 criteria 好像是个查询规则对象?Sidekiq 最好不要用对象做参数,作者建议在用 ActiveRecord 时只传 ID,不要传查询结果,你这里用的 criteria 应该也可以只传构造这个 criteria 使用的参数,然后再 Job 执行时创建 criteria 吧?

对 Awlter1 回复

代码已经留给前公司做遗产了。我当时用的是 AR,dump 的时候会 dump 所有数据,只好用了比较丑的写法,把实例变量扣出来,然后在 job 里组装。不知道 mongoid 会不会有这种情况。只是 2 进制的话 base64 就行了。

@coderliu 对,criteria 是个查询规则

@Rei dump 出来的是查询规则,我上图吧

@weito 嗯嗯,好的,看来 mongoid 这块还挺方便点

需要 登录 后方可回复, 如果你还没有账号请 注册新账号