2013-03-17 55 views
9

如何序列化數組並將其反序列化爲字符串?我嘗試了下面的代碼,但它並沒有真正返回原始數組,而是針對字符串數組。如何序列化數組並反序列化返回

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 }

回答

29

的標準方法是用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] 
3

拆分僅僅是一個工具切斷字符串 - 它不知道字符串來自哪裏。

有很多序列化數據的方法:YAML,JSON和Marshal是三個屬於Ruby標準庫的部分。所有區分字符串,整數等等。

每個人都有優點和缺點。例如,如果您需要與非Ruby代碼交換數據,從不受信任的源加載Marshal數據是危險的,Marshal並不好。 JSON通常是一個很好的allrounder。

+1

加載編組數據有什麼危險?你是否想過'eval'?元帥是確保原始編碼的唯一方法。 – pguardiario 2013-03-17 13:15:16

+2

引用元帥的紅寶石文檔「按設計,:: load可以反序列化幾乎所有加載到Ruby進程的類,在很多情況下,如果Marshal數據是從不受信任的源加載的,這可能會導致遠程代碼執行。 – 2013-03-17 14:43:03

+1

我想知道你是否可以在OP的情況下給出一個具體的例子,儘管可能發生。我不認爲這是真的可能。 – pguardiario 2013-03-17 14:53:57