Robert Klemme
6/5/2008 7:45:00 PM
On 05.06.2008 20:34, Junkone wrote:
> hello
> i am trying to serialise a object to file. i have errors when i try to
> restore the object. any ideas
>
> for eg
> irb(main):009:0> a=Hash.new
> => {}
> irb(main):010:0> a[1]='key'
> => "key"
> irb(main):011:0> a[1]='kew'
> => "kew"
> irb(main):016:0> a=> {1=>"kew"}
> irb(main):022:0> f=File.new("c:\\temp\\log",File::CREAT|File::TRUNC|
> File::RDWR)
> => #<File:c:\temp\log>
> irb(main):023:0> data=Marshal.dump(a,f)
> => #<File:c:\temp\log>
> irb(main):024:0> f.close
> => nil
> irb(main):025:0> f1=File.open("c:\\temp\\log",File::NONBLOCK|
> File::RDONLY)
> => #<File:c:\temp\log>
> irb(main):026:0> Z=Marshal.load(f1)
> IOError: not opened for reading from (irb):26:in `getc'
> from (irb):26:in `load'
> from (irb):26
Works for me. Why do you open in nonblocking mode? That might cause
issues on your system and it's not needed. Also, why do you open in RW
mode when you want to write only?
Here's what I usually do
irb(main):001:0> a={1=>2}
=> {1=>2}
irb(main):002:0> File.open("foo","wb") {|io| Marshal.dump(a,io)}
=> #<File:foo (closed)>
irb(main):007:0> File.open("foo","rb") {|io| Marshal.load io}
=> {1=>2}
If you prefer boolean flags:
irb(main):009:0> File.open("foo", File::WRONLY | File::BINARY) {|io|
Marshal.dump(a,io)}
=> #<File:foo (closed)>
irb(main):010:0> File.open("foo", File::RDONLY | File::BINARY) {|io|
Marshal.load io}
=> {1=>2}
Cheers
robert