Skip to content

Instantly share code, notes, and snippets.

@rklemme
Created December 1, 2014 12:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rklemme/ff43ff3da7d786e28b29 to your computer and use it in GitHub Desktop.
Save rklemme/ff43ff3da7d786e28b29 to your computer and use it in GitHub Desktop.
How to marshal an object with open stream, file descriptor or other non serializable data
#!/usr/bin/ruby
class Logger
ENDL = "\n".freeze
def initialize(file_name)
@file_name = file_name
end
def log(message)
get_stream << message << ENDL
end
def close
# close and catch any error, e.g. from @stream being nil
@stream.close rescue nil
@stream = nil
end
def marshal_dump
@stream.flush rescue nil
@file_name
end
def marshal_load(data)
@file_name = data
end
private
def get_stream
@stream ||= File.open(@file_name, 'a')
end
end
File.delete "log.txt"
log = Logger.new "log.txt"
log.log "first"
log.log "second"
File.open("log.marshal", 'wb') {|io| Marshal.dump(log, io)}
log.log "third"
log.close # close this as we are overwriting variable log
log = File.open("log.marshal", 'rb') {|io| Marshal.load(io)}
log.log "fourth"
log.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment