Aprende a programar con Ruby

Serializando Objetos

Java es capaz de serializar objetos: puede almacenarlos, para luego reutilizarlos cuando sea necesario. Ruby tiene también esta capacidad, pero la llama marshaling. Veamos un ejemplo en el que a partir de una clase, creamos una serie de objetos que almacenamos y luego recuperamos:

  • La clase "personaje.rb":
class Personaje
  def initialize(vida, tipo, armas)
    @vida = vida
    @tipo = tipo
    @armas = armas
  end
  attr_reader :vida, :tipo, :armas
end
  • Creamos los objetos y los guardamos en un fichero usando Marshal.dump:
require 'personaje'
p1 = Personaje.new(120, 'Mago', ['hechizos', 'invisibilidad'])
puts p1.vida.to_s+' '+ p1.tipo+' '
p1.armas.each do |w|
  puts w + ' '
end

File.open('juego', 'w+') do |f|
  Marshal.dump(p1, f)
end
  • Usamos Marshal.load para recuperarlos:
require 'personaje'
File.open('juego') do |f|
  @p1 = Marshal.load(f)
end

puts @p1.vida.to_s + ' ' + @p1.tipo + ' '
@p1.armas.each do |w|
  puts w + ' '
end

Marshal únicamente serializa estructuras de datos; no puede serializar código (como hacen los objetos Proc), o recursos utilizados por otros procesos (como conexiones a bases de datos). Marshal da un error cuando se intenta serializar un fichero.