的元帅模块转储在一个字符串,它可以被写入到一个文件中的对象.读取文件并Marshal.load输入字符串可以得到原始对象.
Marshal.dump采用一个描述为'anIO'的可选参数; 在实践中:一个文件.
h = { "hi" => 1}
# dumping:
File.open("test.marshal", "w"){|to_file| Marshal.dump(h, to_file)}
# retrieving:
p File.open("test.marshal", "r"){|from_file| Marshal.load(from_file)} #=> {"hi"=>1}
Run Code Online (Sandbox Code Playgroud)
Marshal.dump创建的文件格式可以随着不同的Ruby版本或实现而改变.如果你需要创建一个任何版本的Ruby都可以读取的文件,那么比Marshal.dump更喜欢YAML或JSON之类的东西.
某些对象无法序列化(即不能使用Marhsal.dump转储).Lambdas和procs属于这些对象,因此如果您的哈希值已default_proc设置,那么您将无法封送该哈希值.要解决此问题,您可以default_proc在保存之前设置为nil(例如my_hash.default_proc = nil),但是default_proc在加载哈希值后需要重置为正确的值.
一个集合基本上是一个散列,每个键/值对的值设置为相同的值.它是使其表现得像一套的关键.
一旦我们知道了,保存和恢复Set就像保存数组或哈希一样,并且可以通过多种方式完成.
@steenslag提到使用Marshall.dump,这很好.
因为Set是Hash的变体,所以您还可以使用YAML或JSON来序列化数据.两者的最大优点是它们易于在其他语言中重用.YAML和JSON通常用于在主机之间存储和传输数据,并且是非常易读的格式.
以下是一些可以为您提供想法的示例:
require 'set'
require 'json'
require 'yaml'
foo = Set.new
foo << 1
foo << 2
foo << 1
foo # => #<Set: {1, 2}>
Run Code Online (Sandbox Code Playgroud)
foo是一套.它也可以转换为数组:
foo.to_a # => [1, 2]
Run Code Online (Sandbox Code Playgroud)
我们可以使用YAML来序列化Set:
puts YAML.dump(foo)
# >> --- !ruby/object:Set
# >> hash:
# >> 1: true
# >> 2: true
Run Code Online (Sandbox Code Playgroud)
并且,我们可以创建序列化版本,然后再次将其解析回Set:
YAML.load(YAML.dump(foo)) # => #<Set: {1, 2}>
Run Code Online (Sandbox Code Playgroud)
因为foo是Set,我们也可以将它转换为Array,然后使用YAML序列化:
puts YAML.dump(foo.to_a)
# >> ---
# >> - 1
# >> - 2
Run Code Online (Sandbox Code Playgroud)
然后我们可以重新读取数据,如果我们选择,则将其转换回Set:
bar = YAML.load(YAML.dump(foo.to_a)).to_set
bar.class # => Set
bar # => #<Set: {1, 2}>
Run Code Online (Sandbox Code Playgroud)
或者,如果它是一种正在读取YAML的语言,它不支持Set,就像Perl一样,当Perl代码读取和解析数据时,它可以保留为数组.
JSON的工作原理类似.以下是通过Array往返数据的示例:
foo.to_a.to_json # => "[1,2]"
JSON.parse(foo.to_a.to_json) # => [1, 2]
JSON.parse(foo.to_a.to_json).to_set # => #<Set: {1, 2}>
Run Code Online (Sandbox Code Playgroud)
JSON也有这个[]方法,它足够聪明,可以确定传入的参数是String还是Array或Hash.如果是第一个参数被解析并作为Ruby对象返回.如果它是后两个,它被序列化并变成一个字符串:
JSON[foo.to_a] # => "[1,2]"
JSON[JSON[foo.to_a]] # => [1, 2]
JSON[JSON[foo.to_a]].to_set # => #<Set: {1, 2}>
Run Code Online (Sandbox Code Playgroud)
在使用JSON或YAML的任何一种情况下,使用几种不同的IO或File方法可以轻松地读取和写入结果字符串.看看继承自IO的File.write和File.read,如果你决定使用YAML,请查看YAML.load_file,继承自Psych.