[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Saving and restoring with YAML

Ben Giddings

10/1/2003 4:31:00 AM

Hi all,

I have a quick question about YAML. From the documentation it seems as
though it was designed for, or is well suited to saving/restoring an
object's state, but from looking at it I can't quite tell what the ideal
way of doing this is. Say I have a class that looks like:

class Foo
attr_accessor :bar, :arr, :buzz

def initialize
@bar = true
@arr = []
@buzz = "Here is some string"
end
end


What would the "save" and "load" methods of that class look like if I
wanted to use YAML?

Ben


2 Answers

Joel VanderWerf

10/1/2003 4:52:00 AM

0

Ben Giddings wrote:
> Hi all,
>
> I have a quick question about YAML. From the documentation it seems as
> though it was designed for, or is well suited to saving/restoring an
> object''s state, but from looking at it I can''t quite tell what the ideal
> way of doing this is. Say I have a class that looks like:
>
> class Foo
> attr_accessor :bar, :arr, :buzz
>
> def initialize
> @bar = true
> @arr = []
> @buzz = "Here is some string"
> end
> end
>
>
> What would the "save" and "load" methods of that class look like if I
> wanted to use YAML?

If you require ''yaml'', your class already has #to_yaml, which is a save
method, and you can use YAML.load to get it back:

require ''yaml''
foo = Foo.new
YAML.load(foo.to_yaml)

Maybe I''m misunderstanding your question. Do you mean you want instances
of Foo to always be serialized in YAML format, even when using Marshal?


Ben Giddings

10/1/2003 4:53:00 PM

0

Joel VanderWerf wrote:
> If you require 'yaml', your class already has #to_yaml, which is a save
> method, and you can use YAML.load to get it back:

Ah, ok. I didn't realize that kind of magic happened. Cool. But to_yaml
isn't a "save" method, it's a "to-string" type method, right? So should my
save method be something like

def save
File.open("foo_save.yaml", "w") {|file| file.puts(self.to_yaml) }
end

and load like:

def Foo.load
File.open("foo_save.yaml", "r") {
|file|
YAML.load(file)
}
end

If this is the way to do it, that's great. It would be nice, however, if
a) it were more symmetrical so you could have a YAML.save(file) as well as
a YAML.load(file)
b) YAML.load (and YAML.save) could do the File opening, writing, and
closing as well.

Ben