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

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

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 这块还挺方便点

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