保存时忽略变量
与 YAML 序列化一样,可以限制使用 Marshal 进行序列化时要保存的变量。在 YAML 中,我们通过编写一个名为 to_yaml_properties
的方法来完成此目的。而在使用 Marshal 时,我们需要编写一个名为 marshal_dump
的方法。在这个方法的代码中,你应该创建一个包含要保存的实际变量名的数组(在 YAML 中,我们创建了一个包含变量名的字符串数组)。这是一个示例:
limit_m.rb
def marshal_dump
[@num, @arr]
end
另一个不同之处在于,使用 YAML 我们只需加载数据即可重新创建对象。而使用 Marshal 时,我们需要添加一个名为 marshal_load
的特殊方法,任何已加载的数据都作为参数传递给该方法。当你调用 Marshal.load
时,它将被自动调用,它将以数组的形式传递加载的数据。可以从此数组中解析之前保存的对象。你还可以为任何在保存数据时被省略的变量(例如 @str
)赋值:
def marshal_load(data)
@num = data[0]
@arr = data[1]
@str = "default string"
end
这是一个完整的程序,它保存并恢复了变量 @num
和 @arr
但省略了 @str
:
class Mclass
def initialize(aNum, aStr, anArray)
@num = aNum
@str = aStr
@arr = anArray
end
def marshal_dump
[@num, @arr]
end
def marshal_load(data)
@num = data[0]
@arr = data[1]
@str = "default string"
end
end
ob = Mclass.new( 100, "fred", [1,2,3] )
p( ob )
marshal_data = Marshal.dump( ob )
ob2 = Marshal.load( marshal_data )
p( ob2 )
请注意,尽管序列化在内存中完成,但使用 Marshal 在磁盘上保存和加载对象时可以使用相同的技术。