2013-03-17 24 views
9

Wie serialisiere ich ein Array und deserialisiere es von einem String? Ich habe versucht, den folgenden Code, aber es gibt nicht wirklich das ursprüngliche Array von Ganzzahlen, sondern für das Array von Zeichenfolgen.Serialisieren eines Arrays und Deserialisieren Zurück

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

Gibt es eine Möglichkeit, es wieder auf ganze Zahlen zu erhalten, ohne die .collect{ |x| x.to_i } zu haben?

Antwort

29

Der übliche Weg ist mit Marshal:

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

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

Aber Sie können es auch mit JSON:

require 'json' 

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

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

Oder YAML:

require 'yaml' 

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

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

Split ist nur ein Werkzeug für Zerhacken von Saiten - es weiß nicht, woher diese Saite stammt.

Es gibt viele Möglichkeiten, Daten zu serialisieren: YAML, JSON und Marshal sind drei, die Teil der Ruby Standard Library sind. Alle unterscheiden zwischen Zeichenfolgen, Ganzzahlen und so weiter.

Es gibt Vor- und Nachteile für jeden. Beispielsweise ist das Laden von Marshal-Daten aus einer nicht vertrauenswürdigen Quelle gefährlich und Marshal ist nicht gut, wenn Sie die Daten mit Nicht-Ruby-Code austauschen müssen. JSON ist normalerweise ein guter Allrounder.

+1

Was ist gefährlich beim Laden von gemarshallt Daten? Denkst du vielleicht an "eval"? Marshal ist die einzige Möglichkeit, die ursprüngliche Kodierung sicherzustellen. – pguardiario

+2

Um die Ruby-Dokumentation für Marshalling zu zitieren "Nach dem Design kann :: load fast jede in den Ruby-Prozess geladene Klasse deserialisieren. In vielen Fällen kann dies zu Remotecodeausführung führen, wenn die Marshal-Daten von einer nicht vertrauenswürdigen Quelle geladen werden." –

+1

Ich frage mich, ob Sie ein konkretes Beispiel geben können, wo das bei OPs passieren könnte. Ich denke nicht, dass es wirklich möglich ist. – pguardiario

Verwandte Themen