使用 Scala RemoteActors 时,我得到了一个 ClassNotFoundException,它引用了 scala.actors.remote.NetKernel。我复制了别人的示例并添加RemoteActor.classLoader = getClass.getClassLoader
到我的 Actor 中,现在一切正常。为什么这是必要的?
问问题
1122 次
1 回答
5
远程 Actor 使用 Java 序列化来来回发送消息。在 actor 库中,您会找到一个自定义对象输入流 ( https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/actors/scala/actors/remote/JavaSerializer.scala )用于将对象序列化到/从套接字。还有一些路由代码和其他魔法。
无论如何,用于远程处理的 ClassLoader 是相当重要的。如果您不熟悉 Java RMI,我建议您查找它。在任何情况下,Scala 在序列化/反序列化 Actor 时选择的 ClassLoader 是位于 RemoteActor 上的,默认为 null。
这意味着默认情况下,如果不指定 ClassLoader,您将不高兴;)。
如果您处于控制类加载器的环境中,例如 OSGi,您需要确保将此值设置为一个类加载器,该类加载器可以访问所有序列化参与者使用的所有类。
希望有帮助!
于 2010-08-23T14:02:27.293 回答