有没有办法创建一个实例方法(de)使用marshal序列化对象?

时间:2016-04-14 16:00:45

标签: ruby serialization marshalling

我有一个这样的课程:

class MyClass
  attr_accessor :a, :b
end

有没有办法编写一个实例方法,可以用这样的marshal(de)序列化这个对象:

class MyClass
  attr_accessor :a, :b
  def load(file)
    #??
  end
  def save(file)
    #??
  end
end

我一直在保存它:

File.open("#{SAVE_PATH}/stats", "wb") {|f| f.write(Marshal.dump(stats))

并加载:

stats = Marshal.load(File.binread("#{SAVE_PATH}/stats"))

它有效,但我想清理我的代码。

1 个答案:

答案 0 :(得分:1)

你已经拥有了所需的一切。为什么不组装它们呢?怎么样:

def self.load
  Marshal.load(File.binread("#{SAVE_PATH}/stats"))
end

def save
  File.open("#{SAVE_PATH}/stats", "wb") do |f|
    f.write(Marshal.dump(self))
  end
end

请注意,load作为类方法更好,因为它返回一个对象的实例。 save方法可以是实例方法,因为您可以使用self作为要保存的内容。

如果您持久化的路径没有改变,您可能希望为此定义一个常量,以避免在两种方法中重复它。