Comment puis-je enregistrer un objet dans un fichier?
Je voudrais enregistrer un objet dans un fichier, puis de le lire à partir du fichier facilement. Comme exemple simple, disons que j'ai le texte suivant tableau 3d:
m = [[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]]
Est-il facile de l'API Ruby que je peux utiliser pour réaliser cela sans programmation un analyseur d'interpréter les données à partir du fichier? Dans l'exemple que j'ai donner c'est facile, mais comme les objets deviennent plus complexes, il devient ennuyeux pour en faire des objets persistants.
Vous devez vous connecter pour publier un commentaire.
Voir Le Maréchal: http://ruby-doc.org/core/classes/Marshal.html
-ou-
YAML: http://www.ruby-doc.org/core/classes/YAML.html
Vous avez besoin de sérialiser les objets avant de les enregistrer dans un fichier et désérialiser à les récupérer en arrière. Comme mentionné par Cory, 2 standard de sérialisation des bibliothèques sont largement utilisés,
Maréchal
etYAML
.Les deux
Marshal
etYAML
utiliser les méthodesdump
etload
pour la sérialisation et la désérialisation respectivement.Ici est de savoir comment vous pourriez les utiliser:
Vous devez être prudent au sujet de la taille du fichier et d'autres bizarreries associé avec le Fichier de lecture /écriture.
Plus d'infos, de cours peut être trouvée dans la documentation de l'API.
File.open('/path/to/file.extension', 'wb') {|f| f.write(Marsshal.dump(m)) }
etFile.open('/path/to/file.extension', 'rb') {|f| m = Marshal::load(f)}
(Rendant binaire de lecture&l'écriture, ce qui peut avoir été la norme à l'époque, sinon il y a un ASQUES-8BIT en UTF8-Conversion d'erreur popping up) - et si m est un objet d'un définies manuellement classe, je dois veiller à ce que cette classe est chargée avant de Marshall::load fonctionne (sinon vous avez de la classe, du modul erreur inconnue)Marshal#load
est un fait, mais vous avez raison de le mentionner explicitement. En outre, ce code a été écrit en 1.8.7 (pour les 1.9.3 trop), mais merci de remarquer à propos de la version 2.0.0. Je vais donner un coup de feu et la mise à jour de la réponse.YAML et Maréchal sont la plupart des réponses évidentes, mais en fonction de ce que vous avez l'intention de faire avec les données, sqlite3 peut être une option utile aussi.
sqlite3
parce qu'elle implique le type de données au lieu d'utiliser un support rigide type de système: sqlite.org/datatype3.html