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 № 1Ruby 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