1

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

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

我不知道这样的拦截是否可行,因为自定义反序列化器必须实现 akka.serialization.Serializer ,它具有以下方法

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

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

有没有办法在较低级别自定义 Akka 反序列化以适应我的需求?

其他解决方案

  • 该问题类似于以下 SO 问题中描述的问题,其中提出了不同的解决方案:将远程对象反序列化为最窄的可访问类 在那里有答案仍然很有用。但是,该解决方案对我来说还不够,因为虽然可以限制接口,但我仍然需要一个带有额外方法的类实现。
4

1 回答 1

0

FACT 1.实际上,我发现有一个使用 Class 类型提示的反序列化的替代方法,即使用 string manifest 进行反序列化。参考: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 // !!!
于 2016-02-08T21:02:18.993 回答