Serialization 为什么需要使用Scala RemoteActors设置类加载器?

Serialization 为什么需要使用Scala RemoteActors设置类加载器?,serialization,scala,classloader,remote-actors,Serialization,Scala,Classloader,Remote Actors,使用Scala RemoteActors时,我得到了一个ClassNotFoundException,它引用了Scala.actors.remote.NetKernel。我复制了其他人的示例,并将RemoteActor.classLoader=getClass.getClassLoader添加到我的Actor中,现在一切都正常了。为什么需要这样做?远程参与者使用Java序列化来回发送消息。在actors库中,您将找到一个自定义对象输入流(),用于将对象序列化到套接字或从套接字序列化对象。还有一些

使用Scala RemoteActors时,我得到了一个ClassNotFoundException,它引用了Scala.actors.remote.NetKernel。我复制了其他人的示例,并将
RemoteActor.classLoader=getClass.getClassLoader
添加到我的Actor中,现在一切都正常了。为什么需要这样做?

远程参与者使用Java序列化来回发送消息。在actors库中,您将找到一个自定义对象输入流(),用于将对象序列化到套接字或从套接字序列化对象。还有一些路由代码和其他魔法

在任何情况下,用于远程处理的类加载器都非常重要。如果您不熟悉JavaRMI,我建议您查找它。在任何情况下,Scala在序列化/反序列化参与者时选择的类加载器都位于RemoteActor上,默认为null

这意味着默认情况下,如果不指定ClassLoader;),您将不满意

如果您在一个控制类加载器的环境中,比如OSGi,那么您需要确保将该值设置为一个类加载器,该类加载器可以访问所有序列化参与者使用的所有类


希望有帮助

谢谢你的详尽回答。Scala没有办法选择比null更好的默认值吗?据我所知,null是平台默认值。实际上,
null
类加载器指的是设置Java运行时的“系统类加载器”。为什么系统类加载器不正常?不是100%正确:它不一定使用“系统”类加载器,它实际上可能使用“引导”,具体取决于对“latestUserDefinedLoader”的调用。请参阅:。您会注意到Scala actors使用了类似的解决方案来解决需要设置RemoteActor.classLoader的问题。另外,wikipedia有一篇关于类加载层次结构的文章: