Would it be possible to implement read/writeResolve, have it obtain a
runtime from a ThreadLocal, and delegate to marshalling calls?
Cheers,
Robert
Charles Oliver Nutter wrote:
Fausto Lelli wrote:
ah ok,
so the marshalled ruby object carries with it all the runtime info
or else ?
in the latter case how big would it be ?
Looks like there's still a little confusion here. Let me set out the
facts clearly.
Java serialization:
1. Happens when the app server wants it to (i.e. app server "pulls" the
objects and "pushes" them back onto another JVM). In other words, it
happens at a level we can't control.
2. Can't serialize all of a RubyObject yet (including but not limited to
RubyModule and its methods, Ruby runtime, and so on) because many of
those objects are linked to the rest of the Ruby object/class graph.
3. Can't deserialize an object such that we can use it on the other
side, because of (2) the Ruby runtime field doesn't survive
serialization and because of (1) the objects arriving at the target
server can't be reattached to a new runtime.
We can't control both ends of the serialization in an app server, which
means we can't specify that objects coming out of the pipe should be
instantiated for a given runtime. So the bottom line here is that until
a Ruby object can be passed freely from Ruby runtime to Ruby runtime, we
can't reliably serialize them using Java serialization.
Ruby marshalling:
1. Is initiated by the application code, not by the host runtime or
server (i.e. Rails asks Ruby to push the objects out to a store and pull
them back in on the other side)
2. Is dependent on a Ruby runtime being present to unmarshal all
objects, but this is ok because of (1) we know a runtime will be present.
3. Can marshal objects from one runtime to another because only the
relevant data for the objects is persisted to the other side.
A combined approach would be possible if and only if the marshalling
logic can be modified to work without a Ruby runtime present, since the
limitations of Java serialization prevent us from providing a rich
object deserializer when we aren't initiating the serialization or
deserialization process.
Think of it like this: You want to serialize a graph of Java objects and
send them to a C-based server...without a Java runtime on the other end,
you wouldn't be able to do anything with those objects.
Hopefully this clears things up a bit...
- Charlie
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel