如何将对象保存到文件?

Fle*_*seo 25 ruby serialization json yaml marshalling

我想将一个对象保存到一个文件,然后轻松地从文件中读取它.举个简单的例子,假设我有以下3d数组:

m = [[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]],
[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]]
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的Ruby API,我可以使用它来实现这一点,而无需编写解析器来解释文件中的数据?在示例中,我给它很简单,但随着对象变得更加复杂,使对象持久化变得很烦人.

Swa*_*and 53

您需要先序列化对象,然后才能将它们保存到文件中并对其进行反序列化以将其检索回来.正如Cory所提到的,2个标准序列化库被广泛使用,Marshal并且YAML.

两者MarshalYAML用的方法dumpload用于序列化和反序列化分别.

以下是如何使用它们:

m = [
     [
      [0, 0, 0],
      [0, 0, 0],
      [0, 0, 0]
     ],
     [
      [0, 0, 0],
      [0, 0, 0],
      [0, 0, 0]
     ]
    ]

# Quick way of opening the file, writing it and closing it
File.open('/path/to/yaml.dump', 'w') { |f| f.write(YAML.dump(m)) }
File.open('/path/to/marshal.dump', 'wb') { |f| f.write(Marshal.dump(m)) }

# Now to read from file and de-serialize it:
YAML.load(File.read('/path/to/yaml.dump'))
Marshal.load(File.read('/path/to/marshal.dump'))
Run Code Online (Sandbox Code Playgroud)

您需要注意文件大小和与文件读/写相关的其他怪癖.

更多信息,当然可以在API文档中找到.


Cor*_*ory 15

见Marshal:http://ruby-doc.org/core/classes/Marshal.html

-要么-

YAML:http://www.ruby-doc.org/core/classes/YAML.html

  • JSON也会这样做. (3认同)
  • Marshal不是一个很好的持久性工具,格式取决于Ruby版本,并且无法在新Rubies中解码旧的Marshal格式.["在正常使用中,编组只能加载使用相同主版本号和相同或较低版本号编写的数据."](http://ruby-doc.org/core/Marshal.html). (3认同)