No, none of the nashorn objects are Serializable and that is by design! As you've found out, Nashorn objects are too 'tied' to the current execution state - in which most of the objects are not Serializable.
-Sundar On 6/27/2016 8:56 PM, Tristan Tarrant wrote: > Hi all, > > I've been playing with Nashorn in combination with the Streams API in > the context of being able to run functions in a distributed > environment (i.e. Infinispan's server-side scripting). > > In plain Java, a lambda has a SerializedLambda form which basically > encapsulates all of the coordinates that allow the recreation of a > MethodHandle on the remote side. This obviously assumes that the > remote classloader has access to the exact same bytecode. > > Nashorn lambdas however do not (or cannot?) have a SerializedLambda > representation, so I'm looking for an alternative way to identify them. > > Consider the following snippet which is a (dumb) example: > > map.entrySet().stream().map(function(e) e.getValue()) > > On the Java side, the map method takes a Function parameter. > Inspecting the parameter I see that Nashorn has created an adapter > class at runtime > (jdk.nashorn.javaadapters.java.util.function.Function) and that the > apply() method of that class is a BoundMethodHandle$Species_LL. > Unfortunately there is no reference to the original ScriptFunction, > which would otherwise allow me to invoke toSource() on it, simply > serialize that string, send it to the remote node, compile it and > invoke it. > > Inspecting further I've understood that anonymous javascript functions > get bound to method handles identified by a name in the form of L:x > where "x" looks like a counter. Compiling the same script on multiple > nodes, the identifier is consistent, however I've found no way to > invoke those methodhandles on the remote nodes. > I've noticed that it's possible to get the ScriptFunction passed as a > parameter (needsCallee), but I haven't understood how to do that. > > So my question is: given a Nashorn Java adapter generated from a > ScriptFunction, is there a way for me to identify the ScriptFunction > it originates from and to invoke that same function "by name" on a > remote node which has the same script ? > > Thanks > > Tristan >