问题/背景。我需要向远程角色发送一些消息。这些消息可能包含在接收方未知的类的对象。为了避免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.实际上,我发现使用类类型提示进行反序列化还有另一种方法,即使用字符串清单进行反序列化。参考:http://doc.akka.io/docs/akka/2.4.0/scala/serialization.html#Serializer_with_String_Manifest

注意:Akka
事实2.我还发现您Akka不一定会为您提供类型提示。您可以通过以下方式禁用类型提示

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

10-01 05:33
查看更多