2013-03-17 10 views
9

W jaki sposób można przekształcić do postaci szeregowej tablicę i ponownie sformatować ją z ciągu znaków? Próbowałem następujący kod, ale tak naprawdę nie zwraca oryginalnej tablicy liczb całkowitych, ale robi dla tablicy ciągów.Jak serializować tablicę i przekształcać w postać szeregową

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' ] 

Czy istnieje sposób, aby dostać się z powrotem do liczb całkowitych, ale bez .collect{ |x| x.to_i }?

Odpowiedz

29

Standardowym sposobem jest z Marshal:

x = Marshal.dump([1, 2, 3]) 
#=> "\x04\b[\bi\x06i\ai\b" 

Marshal.load(x) 
#=> [1, 2, 3] 

Ale można też zrobić to z JSON:

require 'json' 

x = [1, 2, 3].to_json 
#=> "[1,2,3]" 

JSON::parse(x) 
#=> [1, 2, 3] 

Or YAML:

require 'yaml' 

x = [1, 2, 3].to_yaml 
#=> "---\n- 1\n- 2\n- 3\n" 

YAML.load(x) 
#=> [1, 2, 3] 
3

Split jest tylko narzędziem dla siekanie łańcuchów - nie wiadomo, skąd pochodzi ten sznur.

Istnieje szereg sposobów szeregowania danych: YAML, JSON i Marshal to trzy części Biblioteki Standardowej Rubiego. Wszystkie rozróżniają łańcuchy, liczby całkowite i tak dalej.

Istnieją zalety i wady każdego z nich. Na przykład ładowanie danych Marszałka z niezaufanego źródła jest niebezpieczne, a Marszałek nie jest dobry, jeśli trzeba wymieniać dane z nie-Rubinowym kodem. JSON jest zwykle dobrym allrounderem.

+1

Co jest niebezpiecznego w ładowaniu zebranych danych? Czy może myślisz o 'eval'? Marszałek jest jedynym sposobem na zapewnienie oryginalnego kodowania. – pguardiario

+2

Zacytować ruby ​​docs dla marszałka "Według projektu :: load może deserializować prawie każdą klasę załadowaną do procesu Rubiego, w wielu przypadkach może to prowadzić do zdalnego wykonania kodu, jeśli dane Marshalla zostaną załadowane z niezaufanego źródła." –

+1

Zastanawiam się, czy możesz podać konkretny przykład, gdzie w przypadku OP może się zdarzyć. Nie sądzę, że to naprawdę możliwe. – pguardiario