stdlib/marshal_core_values.rb

tests/_examples/stdlib/marshal_core_values.rb in the metorex repository.

# Marshal writes exceptions, ranges, times and wide numbers the way Ruby
# does, and reads them back whole.
failure = RuntimeError.new("disk full")
failure.set_backtrace(["store.rb:12"])
failure.instance_variable_set(:@retries, 3)
p(Marshal.dump(failure))

begin
  begin
    raise ArgumentError, "bad size"
  rescue ArgumentError
    raise RuntimeError, "write failed"
  end
rescue RuntimeError => raised
  back = Marshal.load(Marshal.dump(raised))
  p([back.class, back.message, back.cause.class, back.cause.message])
end

p(Marshal.dump(1..2))
p(Marshal.dump(1...2))
p(Marshal.load(Marshal.dump(3...9)))

moment = Time.utc(2012, 1, 1)
p(Marshal.dump(moment))
p(Marshal.load(Marshal.dump(moment)) == moment)

wide = 2**64
p(Marshal.dump([wide, wide]))

p(Exception.allocate.message)

Output:

"\x04\bo:\x11RuntimeError\b:\tmesgI\"\x0Edisk full\x06:\x06ET:\abt[\x06I\"\x10store.rb:12\x06;\aT:\r@retriesi\b"
[RuntimeError, "write failed", ArgumentError, "bad size"]
"\x04\bo:\nRange\b:\texclF:\nbegini\x06:\bendi\a"
"\x04\bo:\nRange\b:\texclT:\nbegini\x06:\bendi\a"
3...9
"\x04\bIu:\tTime\r \x00\x1C\xC0\x00\x00\x00\x00\x06:\tzoneI\"\bUTC\x06:\x06EF"
true
"\x04\b[\al+\n\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00@\x06"
"Exception"