End of file error when trying to Marshal.load

Hi,-

I am trying out the marshaling functionality of Ruby with this
documentation as a guide:

http://www.ruby-doc.org/core/classes/Marshal.html

Code goes like this:

···

*****************************

class Klass
  def initialize(str)
    @str = str
  end
  def sayHello
    @str
  end
end

def marshalKlass
  o = Klass.new("hello\n")
  print o.sayHello
  Marshal.dump(o, File.open("output.txt", "w"))
  data = File.open("output.txt") # all fine up until here
  obj = Marshal.load(data) # EOFError
  print obj.sayHello
end

if __FILE__ == $PROGRAM_NAME
  marshalKlass
end

*****************************

The line:
obj = Marshal.load(data)
gives the following error:

Klass.rb:19:in `load': end of file reached (EOFError)
  from Klass.rb:19:in `marshalKlass'
  from Klass.rb:32

The line:
data = File.open("output.txt") places the cursor at the start of the
file. What's wrong?

Thanks!

/ Vahagn
--
Posted via http://www.ruby-forum.com/.

Vahagn Hayrapetyan wrote:

The line:
obj = Marshal.load(data)
gives the following error:

Klass.rb:19:in `load': end of file reached (EOFError)
  from Klass.rb:19:in `marshalKlass'
  from Klass.rb:32

The line:
data = File.open("output.txt") places the cursor at the start of the
file. What's wrong?

I'm guessing you're on Windows. You need to open the file in binary mode. That is, with "wb" and "rb".

···

--
MagickWand for Ruby - http://magickwand.rubyforge.org/

Tim, I'm on Mac OS X (Leopard). Now I have:

  Marshal.dump(o, File.open("output.txt", "wb"))
  data = File.open("output.txt", "rb")
  obj = Marshal.load(data)

But I get the exact same error.

/ Vahagn

Tim Hunter wrote:

···

Vahagn Hayrapetyan wrote:

file. What's wrong?

I'm guessing you're on Windows. You need to open the file in binary
mode. That is, with "wb" and "rb".

--
Posted via http://www.ruby-forum.com/\.

Please do not top post.

···

On 05.09.2009 13:45, Vahagn Hayrapetyan wrote:

Tim, I'm on Mac OS X (Leopard). Now I have:

  Marshal.dump(o, File.open("output.txt", "wb"))
  data = File.open("output.txt", "rb")
  obj = Marshal.load(data)

But I get the exact same error.

/ Vahagn

Tim Hunter wrote:

Vahagn Hayrapetyan wrote:

file. What's wrong?

I'm guessing you're on Windows. You need to open the file in binary
mode. That is, with "wb" and "rb".

You also need to make sure you write the complete file which you don't because you're not closing the File properly.

http://blog.rubybestpractices.com/posts/rklemme/001-Using_blocks_for_Robustness.html

Cheers

  robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

@Robert:

Ah! "While not closing a read only file usually does not have dramatic
consequences, not closing a file opened for writing likely has dramatic
consequences."

The working method:

def marshalKlass
  o = Klass.new("hello\n")
  print o.sayHello
  dumped = File.open("output.txt", "w")
  Marshal.dump(o, dumped)
  dumped.close
  data = File.open("output.txt", "r")
  obj = Marshal.load(data)
  data.close
  print obj.sayHello
end

Thanks,
/ Vahagn

···

--
Posted via http://www.ruby-forum.com/.

This is better but my point in the blog article was a different one: use the block form of File.open because it is more robust.

Cheers

  robert

···

On 05.09.2009 14:35, Vahagn Hayrapetyan wrote:

@Robert:

Ah! "While not closing a read only file usually does not have dramatic consequences, not closing a file opened for writing likely has dramatic consequences."

The working method:

def marshalKlass
  o = Klass.new("hello\n")
  print o.sayHello
  dumped = File.open("output.txt", "w")
  Marshal.dump(o, dumped)
  dumped.close
  data = File.open("output.txt", "r")
  obj = Marshal.load(data)
  data.close
  print obj.sayHello
end

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

@Robert: Sure!

def marshal_class
  o = Klass.new("hello")
  print o.sayHello, " from original object\n"
  File.open("data.txt", "w") do |file|
    Marshal.dump(o, file)
  end
  File.open("data.txt", "r") do |file|
    @obj = Marshal.load(file)
  end
  print @obj.sayHello + " from restored object\n"
end

That's a good article, btw.
Cheers,
Vahagn

···

--
Posted via http://www.ruby-forum.com/.