有没有办法将Ruby的对象的人类可读表示转换回此对象

时间:2012-12-11 10:56:51

标签: ruby database string object

想象一下我们所知道的关于Ruby对象的唯一信息是人类可读的格式:

#<User::Class::Element:0x2fef43 @field1 = 1, @field2 = two, @field3 = [1,2,3]>

任务是编写一个方法,该方法可以将此表示转换为此表示所指向的类的对象(当然,可以访问所有适当的名称空间,模块,类和方法)。例如:

obj = humanReadableFormat2Obj("#<User::Class::Element:0x2fef43 @field1 = 1, @field2 = \"two\", @field3 = [1,2,3]>") 
puts obj.field1      #=> "1"
puts obj.field2      #=> "two"
p obj.field3         #=> [1, 2, 3]
puts obj.class.to_s  #=> User::Class::Element

P.S。该任务源于几个大型数据库的同步问题。不是以二进制格式(数百MB)将对象从一个数据库传输到另一个数据库,而是只传输一个脚本(几KB)并在另一个数据库上执行它以创建适当的对象。

1 个答案:

答案 0 :(得分:2)

OxOj gems(分别是XML和JSON)可以序列化为相对人类可读的Ruby对象。这可能是一个更好的解决方案,因为inspect方法并不总是返回Ruby对象的所有属性,正如Sigurd在评论中提到的那样。

Ox docs的例子:

require 'ox'

class Sample
  attr_accessor :a, :b, :c

  def initialize(a, b, c)
    @a = a
    @b = b
    @c = c
  end
end

# Create Object
obj = Sample.new(1, "bee", ['x', :y, 7.0])
# Now dump the Object to an XML String.
xml = Ox.dump(obj)
# Convert the object back into a Sample Object.
obj2 = Ox.parse_obj(xml)