将用户定义的Ruby对象序列化为Riak时堆栈溢出

将用户定义的Ruby对象序列化为Riak时堆栈溢出,ruby,class,stack-overflow,riak,Ruby,Class,Stack Overflow,Riak,在工作过程中 由于某种原因,我注意到我不能在riak中存储时间对象 [3] pry(main)> client = Riak::Client.new(:protocol => "pbc", :pb_port => 8087, :host => "192.168.145.34") => #<Riak::Client [#<Node 192.168.145.34:8098:8087>]> [4] pry(main)> [5] pry(ma

在工作过程中 由于某种原因,我注意到我不能在riak中存储时间对象

[3] pry(main)> client = Riak::Client.new(:protocol => "pbc", :pb_port => 8087, :host => "192.168.145.34")
=> #<Riak::Client [#<Node 192.168.145.34:8098:8087>]>
[4] pry(main)> 
[5] pry(main)> 
[6] pry(main)> tt = client.bucket('test')
=> #<Riak::Bucket {test}>
[7] pry(main)> v = tt.new("ttt")
=> #<Riak::RObject {test,ttt} [#<Riak::RContent [application/json]:nil>]>
[8] pry(main)> v.data = 1
=> 1
[9] pry(main)> v.store
=> #<Riak::RObject {test,ttt} [#<Riak::RContent [application/json]:1>]>
[10] pry(main)> v.data = Time.now
=> 2014-06-22 11:34:01 +0400
[11] pry(main)> v.store
SystemStackError: stack level too deep
from /home/maus/.gem/ruby/1.9.1/gems/pry-0.10.0/lib/pry/pry_instance.rb:353
[3]pry(main)>client=Riak::client.new(:protocol=>“pbc”,:pb_port=>8087,:host=>“192.168.145.34”)
=> #
[4] 撬动(主)>
[5] 撬动(主)>
[6] 撬(主)>tt=客户机桶('测试')
=> #
[7] 撬(主)>v=tt.新(“ttt”)
=> #
[8] 撬(主)>v.data=1
=> 1
[9] 撬动(主)>v.贮存
=> #
[10] 撬动(主)>v.data=Time.now
=> 2014-06-22 11:34:01 +0400
[11] 撬动(主)>v.贮存
SystemStackError:堆栈级别太深
from/home/maus/.gem/ruby/1.9.1/gems/pry-0.10.0/lib/pry/pry_instance.rb:353
之后,我发现了用户定义类的情况:

[16] pry(main)> class Tst
[16] pry(main)*   def initialize(x)
[16] pry(main)*     @x = x
[16] pry(main)*   end  
[16] pry(main)* end  
=> nil
[17] pry(main)> t111 = Tst.new(111)
=> #<Tst:0x9b13f4c @x=111>
[18] pry(main)> v.data = t111
=> #<Tst:0x9b13f4c @x=111>
[19] pry(main)> v.store
SystemStackError: stack level too deep
from /home/maus/.gem/ruby/1.9.1/gems/pry-0.10.0/lib/pry/pry_instance.rb:353
[20] pry(main)> 
[21] pry(main)> v.data = [1,2,3]
=> [1, 2, 3]
[22] pry(main)> v.store
=> #<Riak::RObject {test,test_key} [#<Riak::RContent [application/json]:[1, 2, 3]>]>
[16]撬(主)>Tst级
[16] 撬(主)*def初始化(x)
[16] 撬(主)*@x=x
[16] 撬(主)*端
[16] 撬(主)*端
=>零
[17] 撬杆(主)>t111=尖头新(111)
=> #
[18] 撬(主)>v.数据=t111
=> #
[19] 撬动(主)>v.贮存
SystemStackError:堆栈级别太深
from/home/maus/.gem/ruby/1.9.1/gems/pry-0.10.0/lib/pry/pry_instance.rb:353
[20] 撬动(主)>
[21]撬(主)>v.data=[1,2,3]
=> [1, 2, 3]
[22]撬(主)>v.仓库
=> #
看来我的安装有严重问题。但如何调查呢?我将riak-1.3.2和ruby 1.9.3p194与以下版本的gems一起使用: i18n-0.6.9 builder-3.2.2 beefcake-0.3.7 多线程json-1.10.1 内管-1.0.2
riak-client-1.4.4.1

存储
方法代码路径中,我看到正在使用的值位于
BeefcakeProtobuffsBackend.ObjectMethods::dump_对象
中,它用
实例化
RpbContent
:value=>可能编码(robject.raw_data)
,因此,这似乎是序列化自定义数据的问题

RContent.raw\u数据调用

Serialize只了解极少数内容类型:

  • 序列化程序['text/plain']=textplane
  • 序列化程序['application/json']=ApplicationJSON
  • 序列化程序['application/x-ruby-marshal']=::marshal
content\u type
的默认值是
application/json
,其方法是:

  def dump(object)
    object.to_json(Riak.json_options)
  end
检查
v.raw\u data
是否返回您期望的值,如果没有,请尝试设置
v.content\u type='text/plain'


对于自定义类,确保它有一个返回字符串的
to_json
to_s
方法,并选择适当的内容类型。

SystemStackError
只意味着存在(准)无限递归;Ruby然后在大约10000个递归调用之后抛出一个异常。
  def dump(object)
    object.to_json(Riak.json_options)
  end