Akka Remote和通过自定义反序列化拦截未知类

时间:2016-02-08 08:38:02

标签: java class serialization akka akka-remote-actor

问题/背景即可。我需要向远程actor发送一些消息。这些消息可能包含接收方未知的类的对象。我需要拦截这种情况以避免ClassNotFoundException。

一个解决方案可能包括在消息反序列化时拦截未知类。然后,消息可以被不同的应用程序级消息替换,以便远程参与者可以向发送者传达它没有所需的类。

我不知道这样的拦截是否可行,因为自定义de / serializators必须实现具有以下方法的akka​​.serialization.Serializer

def fromBinary(bytes: Array[Byte],
               clazz: Option[Class[_]]): AnyRef

现在,问题源于为未知类的对象构造Class对象(由Akka完成)。

有没有办法在较低级别定制Akka反序列化以满足我的需求?

其他解决方案

  • 问题类似于以下SO问题中描述的问题,其中提出了不同的解决方案:Deserialize remote object to the narrowest accessible class 在那里得到答案仍然是有用的。但是,这个解决方案对我来说是不够的,因为虽然可以限制接口,但我仍然需要一个带有额外方法的类实现。

1 个答案:

答案 0 :(得分:0)

FACT 1。实际上我发现有一种替代反序列化的类型提示,即反序列化与字符串清单。参考:http://doc.akka.io/docs/akka/2.4.0/scala/serialization.html#Serializer_with_String_Manifest

注意:它不适用于Akka< 2.4.0。它可能很重要,因为从Akka 2.4.0支持Java 1.6 / 1.7被删除。这意味着要使用Akka 2.4,您需要使用Java 8。

FACT 2。我还发现你Akka不一定为你提供类型提示。您可以通过以下方式禁用类型提示

class MyOwnSerializer extends akka.serialization.Serializer {
   override def includeManifest: Boolean = false // !!!