如何序列化数组并从字符串反序列化?我尝试了以下代码,但它并没有真正返回原始整数数组,而是返回字符串数组。
x = [1,2,3].join(',') # maybe this is not the correct way to serialize to string?
=> '1,2,3'
x = x.split(',')
=> [ '1', '2', '3' ]
有没有办法让它回到整数而没有.collect{ |x| x.to_i }
?
如何序列化数组并从字符串反序列化?我尝试了以下代码,但它并没有真正返回原始整数数组,而是返回字符串数组。
x = [1,2,3].join(',') # maybe this is not the correct way to serialize to string?
=> '1,2,3'
x = x.split(',')
=> [ '1', '2', '3' ]
有没有办法让它回到整数而没有.collect{ |x| x.to_i }
?
标准方法是Marshal
:
x = Marshal.dump([1, 2, 3])
#=> "\x04\b[\bi\x06i\ai\b"
Marshal.load(x)
#=> [1, 2, 3]
但你也可以这样做JSON
:
require 'json'
x = [1, 2, 3].to_json
#=> "[1,2,3]"
JSON::parse(x)
#=> [1, 2, 3]
或者YAML
:
require 'yaml'
x = [1, 2, 3].to_yaml
#=> "---\n- 1\n- 2\n- 3\n"
YAML.load(x)
#=> [1, 2, 3]
Split 只是一个切分字符串的工具——它不知道那个字符串是从哪里来的。
序列化数据的方法有很多种:YAML、JSON 和 Marshal 是 Ruby 标准库中的三种。都区分字符串、整数等。
每个都有优点和缺点。例如,从不受信任的来源加载 Marshal 数据是危险的,如果您需要与非 Ruby 代码交换数据,Marshal 就不好。JSON 通常是一个很好的多面手。