保存时忽略变量

与 YAML 序列化一样,可以限制使用 Marshal 进行序列化时要保存的变量。在 YAML 中,我们通过编写一个名为 to_yaml_properties 的方法来完成此目的。而在使用 Marshal 时,我们需要编写一个名为 marshal_dump 的方法。在这个方法的代码中,你应该创建一个包含要保存的实际变量名的数组(在 YAML 中,我们创建了一个包含变量名的字符串数组)。这是一个示例:

limit_m.rb
  1. def marshal_dump
  2. [@num, @arr]
  3. end

另一个不同之处在于,使用 YAML 我们只需加载数据即可重新创建对象。而使用 Marshal 时,我们需要添加一个名为 marshal_load 的特殊方法,任何已加载的数据都作为参数传递给该方法。当你调用 Marshal.load 时,它将被自动调用,它将以数组的形式传递加载的数据。可以从此数组中解析之前保存的对象。你还可以为任何在保存数据时被省略的变量(例如 @str)赋值:

  1. def marshal_load(data)
  2. @num = data[0]
  3. @arr = data[1]
  4. @str = "default string"
  5. end

这是一个完整的程序,它保存并恢复了变量 @num@arr 但省略了 @str

  1. class Mclass
  2. def initialize(aNum, aStr, anArray)
  3. @num = aNum
  4. @str = aStr
  5. @arr = anArray
  6. end
  7. def marshal_dump
  8. [@num, @arr]
  9. end
  10. def marshal_load(data)
  11. @num = data[0]
  12. @arr = data[1]
  13. @str = "default string"
  14. end
  15. end
  16. ob = Mclass.new( 100, "fred", [1,2,3] )
  17. p( ob )
  18. marshal_data = Marshal.dump( ob )
  19. ob2 = Marshal.load( marshal_data )
  20. p( ob2 )

请注意,尽管序列化在内存中完成,但使用 Marshal 在磁盘上保存和加载对象时可以使用相同的技术。