【问题标题】:Is there a way to create an instance method that (de)serializes object with marshal?有没有办法创建一个实例方法,用 marshal (反)序列化对象?
【发布时间】:2016-04-15 00:27:14
【问题描述】:

我有这样的课:

class MyClass
  attr_accessor :a, :b
end

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

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"))

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

【问题讨论】:

  • 保存和加载的代码不是反过来吗?
  • @sawa 是的,我的错。已编辑

标签: ruby serialization marshalling


【解决方案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 作为要保存的东西。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2021-10-24
    相关资源
    最近更新 更多