/ / Serializzare un oggetto su JSON, XML, YAML? - rubino, xml, json, serializzazione, yaml

Serializzare un oggetto su JSON, XML, YAML? - rubino, xml, json, serializzazione, yaml

Ho fatto una domanda precedente sulla serializzazione e la convalida. Qualcuno ha menzionato l'uso della gemma JSON che mi permette di dire al mio oggetto come serializzare con to_json metodo, tuttavia Ruby sembra fare MOLTE cose complicate molto facilmente, tuttavia il rovescio della medaglia alcune cose molto semplici sembrano essere abbastanza complicate, la serializzazione è una di quelle cose.

Voglio scoprire se esiste un modo per avere un oggetto pulito:

class CleanClass
attr_accessor :variable1
attr_accessor :variable2
attr_accessor :variable3
end

cleanObject = CleanClass.new

Idealmente, non voglio sporcare il modello, voglio solo passarlo qualcosa e digli quale dovrebbe essere il tipo di output e lascia che funzioni la sua magia.

Un esempio potrebbe essere qualcosa del tipo:

jsonOutput = MagicSerializer::Json.Serialize(cleanObject)
xmlOutput = MagicSerializer::Xml.Serialize(cleanObject)
yamlOutput = MagicSerializer::Yaml.Serialize(cleanObject)

revertedJsonObject = MagicSerializer::Json.Unserialize(jsonOutput)
revertedXmlObject = MagicSerializer::Xml.Unserialize(xmlOutput)
revertedYamlObject = MagicSerializer::Yaml.Unserialize(yamlOutput)

Voglio passare qualcosa a un oggetto e ottenere le stringhe emesse, quindi essere in grado di riconvertirlo.

So che ActiveModel ha la serializzazionefunzionalità ma ho bisogno di sporcare la mia classe per fare questo, e non voglio cambiare il modello se possibile. ActiveSupport sembra soddisfare i criteri JSON come posso semplicemente chiamarlo e prenderà un oggetto e sputerà JSON, ma vorrei supportare altri tipi.

Ogni ulteriore informazione sarebbe fantastica!

risposte:

11 per risposta № 1

Ruby ha incorporato la serializzazione / deserializzazione automagica su binario e yaml.

YAML:

require "yaml"
serialized = CleanClass.new.to_yaml
object = YAML.load(serialized)

Maresciallo:

serialized = Marshal.dump(CleanClass.new)
object = Marshal.load(serialized)

1 per risposta № 2

Chiedi al tuo metodo di serializzazione magico di sporcare l'oggetto per te; l'emdirtering può avvenire in base all'oggetto.

O sporco a livello di classe.

Ad ogni modo, il tuo codice principale non lo vede.


1 per risposta № 3

Per JSON e YAML sembra abbastanza facile, dal momento che sarebbero solo involucri per to_yaml e to_json metodi (o YAML.load e from_json rispettivamente)

Per JSON dovresti avvolgere le proprie classi attorno a tipi di core (o altri tipi che implementano to_json) ad es. implementare prima un metodo to_hash che poi può essere trasformato in json.

L'XML è molto più complicato a causa dell'aspetto gerarchico, dovresti standardizzarlo, ma in realtà non capisco dalla tua spiegazione cosa c'è di sbagliato con la base to_... metodi. Questa è in realtà la convenzione che usiamo in Ruby. Se si è interessati all'inquinamento dei modelli, è possibile inserire questi metodi in un modulo e includere il modulo nella classe.

module Foo
def to_serialized_type
...
end
end
class CleanClass
include Foo
end