public
Last active

  • Download Gist
proc_marshal.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
require 'jruby'
 
module Serialize
def self.serialize(obj)
baos = java.io.ByteArrayOutputStream.new
oos = java.io.ObjectOutputStream.new(baos)
oos.write_object(JRuby.reference(obj))
oos.close
String.from_java_bytes(baos.to_byte_array)
end
def self.deserialize(str)
bais = java.io.ByteArrayInputStream.new(str.to_java_bytes)
ois = java.io.ObjectInputStream.new(bais)
ois.read_object
end
end
 
class Foo
def make_proc
proc { puts 'hello' }
end
end
 
prc = Foo.new.make_proc
 
class Proc
def _dump(depth)
Serialize.serialize(self)
end
def self._load(str)
Serialize.deserialize(str)
end
end
 
dumped = Marshal.dump(prc)
p dumped
prc = Marshal.load(dumped)
prc.call
zzz output
1 2 3
system ~/projects/jruby $ jruby -X-C proc_marshal.rb
"\004\bu:\tProc\002\227\n\254\355\000\005sr\000\022org.jruby.RubyProcjt\255\035\000\ty\203\002\000\005I\000\004lineL\000\005blockt\000\031Lorg/jruby/runtime/Block;L\000\004filet\000\022Ljava/lang/String;L\000\016sourcePositiont\000&Lorg/jruby/lexer/yacc/ISourcePosition;L\000\004typet\000\036Lorg/jruby/runtime/Block$Type;xr\000\024org.jruby.RubyObject\021bo\361o\020/\315\003\000\000xr\000\031org.jruby.RubyBasicObject%\201\226\325y\332\357\213\003\000\002I\000\005flags[\000\bvarTablet\000\023[Ljava/lang/Object;xp\000\000\000\000ur\000\023[Ljava.lang.Object;\220\316X\237\020s)l\002\000\000xp\000\000\000\000w\006\000\004Procxw\004\000\000\000\000x\000\000\000\027sr\000\027org.jruby.runtime.Block\004\302l\254\320w\307d\002\000\005L\000\abindingt\000\eLorg/jruby/runtime/Binding;L\000\004bodyt\000\035Lorg/jruby/runtime/BlockBody;[\000\aescapedt\000\002[ZL\000\004proct\000\024Lorg/jruby/RubyProc;L\000\004typeq\000~\000\004xpsr\000\031org.jruby.runtime.Binding\316\374\212\v\215\362\202\217\002\000\aI\000\004lineL\000\ndummyScopet\000 Lorg/jruby/runtime/DynamicScope;L\000\fdynamicScopeq\000~\000\022L\000\004fileq\000~\000\002L\000\005framet\000\031Lorg/jruby/runtime/Frame;L\000\004selft\000'Lorg/jruby/runtime/builtin/IRubyObject;L\000\nvisibilityt\000\036Lorg/jruby/runtime/Visibility;xp\000\000\000\027psr\000*org.jruby.runtime.scope.NoVarsDynamicScopeP\2630\204\263d\274\327\002\000\000xr\000\036org.jruby.runtime.DynamicScope\210\036\r\231\254\213\332C\002\000\005L\000\abackrefq\000~\000\024L\000\tevalScopeq\000~\000\022L\000\blastlineq\000~\000\024L\000\006parentq\000~\000\022L\000\vstaticScopet\000\036Lorg/jruby/parser/StaticScope;xpppppsr\000!org.jruby.parser.LocalStaticScope\036\226h\301\271!\305\354\f\000\000xr\000\034org.jruby.parser.StaticScopeC8\332Rx\336\020u\f\000\000xpsq\000~\000\esq\000~\000\eppw%\000\000\000\002\000\003prc\000\006dumped\000\000\000\002\000\000\000\000\000\000\000\000\000\000\377\377\377\377\001\001xq\000~\000\037w\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\001\001xq\000~\000\037w\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\001\001xt\000\017proc_marshal.rbsr\000\027org.jruby.runtime.Frame>_l2V\216\004x\002\000\bZ\000\016isBindingFrameI\000\njumpTargetI\000\004lineL\000\005blockq\000~\000\001L\000\bfileNameq\000~\000\002L\000\004nameq\000~\000\002L\000\004selfq\000~\000\024L\000\nvisibilityq\000~\000\025xp\000\000\000\003\365\000\000\000\esq\000~\000\vpsr\000\037org.jruby.runtime.NullBlockBody=;\301j\343\247dH\002\000\000xr\000\eorg.jruby.runtime.BlockBody\221\251\265\e\276\031\311\245\002\000\001I\000\fargumentTypexp\000\000\000\000ur\000\002[ZW\217 9\024\270]\342\002\000\000xp\000\000\000\001\000p~r\000\034org.jruby.runtime.Block$Type\000\000\000\000\000\000\000\000\022\000\000xr\000\016java.lang.Enum\000\000\000\000\000\000\000\000\022\000\000xpt\000\006NORMALq\000~\000 t\000\tmake_procsq\000~\000\005\000\000\000\000q\000~\000\nw\005\000\003Fooxw\004\000\000\000\000x~r\000\034org.jruby.runtime.Visibility\000\000\000\000\000\000\000\000\022\000\000xq\000~\000*t\000\006PUBLICq\000~\000.q\000~\0000sr\000\"org.jruby.runtime.InterpretedBlock\242\350\350\026\255\031\e\246\002\000\005Z\000\nnoargblockL\000\005arityt\000\031Lorg/jruby/runtime/Arity;L\000\bassignert\000%Lorg/jruby/runtime/assigner/Assigner;L\000\bbodyNodet\000\024Lorg/jruby/ast/Node;L\000\005scopeq\000~\000\031xq\000~\000%\000\000\000\000\001sr\000\027org.jruby.runtime.Arity\000\000\000\000\000\000\000\001\002\000\001I\000\005valuexp\377\377\377\377sr\0001org.jruby.runtime.assigner.Pre0Rest0Post0Assigner\177h\334\330\201\376\347\t\002\000\000xr\000#org.jruby.runtime.assigner.Assigner\235\331\202\026\311r\276N\002\000\000xpsr\000\031org.jruby.ast.NewlineNode\000\000\000\000\000\000\000\000\f\000\000xr\000\022org.jruby.ast.Node\000\000\000\000\000\000\000\000\f\000\000xpsr\000)org.jruby.lexer.yacc.SimpleSourcePosition\000\000\000\000\000\000\000\000\f\000\000xpw\025\000\017proc_marshal.rb\000\000\000\027xsr\000\035org.jruby.ast.FCallOneArgNode\000\000\000\000\000\000\000\000\f\000\000xr\000\027org.jruby.ast.FCallNode\000\000\000\000\000\000\000\000\f\000\000xq\000~\000=q\000~\000@sr\000\027org.jruby.ast.ArrayNode\000\000\000\000\000\000\000\000\f\000\000xr\000\026org.jruby.ast.ListNode\000\000\000\000\000\000\000\000\f\000\000xq\000~\000=q\000~\000@w\004\000\000\000\001sr\000\025org.jruby.ast.StrNode\000\000\000\000\000\000\000\000\f\000\000xq\000~\000=q\000~\000@ur\000\002[B\254\363\027\370\006\bT\340\002\000\000xp\000\000\000\005helloxw\001\001xpw\006\000\004putsq\000~\000Hxxsr\000!org.jruby.parser.BlockStaticScope\312 $\bau\rk\f\000\000xq\000~\000\034q\000~\000\035q\000~\000\037w\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\000\000xuq\000~\000'\000\000\000\001\001q\000~\000\b~q\000~\000)t\000\006LAMBDAq\000~\000 pq\000~\000N"
hello

Just curious if this still works, I get the following: NativeException: java.io.NotSerializableException: org.jruby.runtime.Block at line 8.

Thanks

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.