Ruby 如何序列化数组并反序列化回

Ruby 如何序列化数组并反序列化回,ruby,serialization,deserialization,Ruby,Serialization,Deserialization,如何序列化数组并从字符串反序列化它?我尝试了下面的代码,但它实际上并没有返回原始整数数组,而是返回字符串数组 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}
的情况下将其返回到整数?

标准方法是使用
封送

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标准库的三种。它们都区分字符串、整数等


每种方法都有优点和缺点。例如,如果需要使用非Ruby代码交换数据,则从不受信任的源加载封送处理数据是危险的,封送处理不好。JSON通常是一个很好的全能者

加载编组数据有什么危险?您是否正在考虑评估?封送处理是确保原始编码的唯一方法。引用ruby docs for Marshal“按设计::load可以反序列化加载到ruby进程中的几乎所有类。在许多情况下,如果封送处理数据是从不受信任的源加载的,则这可能导致远程代码执行。”我想知道你是否能给出一个具体的例子,在OP的情况下,这种情况可能会发生。我认为这是不可能的。如果你控制了源数据,你就没事了。如果不是。。。关于YAML,但同样适用于marshal