Akka Remote和通过自定义反序列化拦截未知类
Akka Remote and interception of unknown classes through custom deserialization
Problem/Context。我需要向远程参与者发送一些消息。这些消息可能包含收件人未知的 class 对象。我需要拦截这种情况以避免 ClassNotFoundException.
一个解决方案可能包括在消息反序列化时拦截未知的classes。然后,该消息可能会被不同的应用程序级消息替换,以便远程参与者可以向发送者传达它没有所需的 classes.
我不知道这样的拦截是否可行,因为自定义de/serializators必须实现akka.serialization.Serializer,它有下面的方法
def fromBinary(bytes: Array[Byte],
clazz: Option[Class[_]]): AnyRef
现在,问题源于为未知 class 对象构建 Class 对象(由 Akka 完成)。
有没有办法在较低级别自定义 Akka 反序列化以满足我的需求?
其他解决方案。
- 该问题类似于以下 SO 问题中描述的问题,其中提出了不同的解决方案:Deserialize remote object to the narrowest accessible class
在那里得到答案仍然有用。但是,该解决方案对我来说还不够,因为虽然可以限制接口,但我仍然需要一个带有额外方法的 class 实现。
事实 1. 其实我发现有一个反序列化的替代方法 Class 类型提示,即 反序列化与字符串清单.参考: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.
事实 2. 我还发现您的 Akka 不一定会为您提供类型提示。您可以通过以下方式禁用类型提示
class MyOwnSerializer extends akka.serialization.Serializer {
override def includeManifest: Boolean = false // !!!
Problem/Context。我需要向远程参与者发送一些消息。这些消息可能包含收件人未知的 class 对象。我需要拦截这种情况以避免 ClassNotFoundException.
一个解决方案可能包括在消息反序列化时拦截未知的classes。然后,该消息可能会被不同的应用程序级消息替换,以便远程参与者可以向发送者传达它没有所需的 classes.
我不知道这样的拦截是否可行,因为自定义de/serializators必须实现akka.serialization.Serializer,它有下面的方法
def fromBinary(bytes: Array[Byte],
clazz: Option[Class[_]]): AnyRef
现在,问题源于为未知 class 对象构建 Class 对象(由 Akka 完成)。
有没有办法在较低级别自定义 Akka 反序列化以满足我的需求?
其他解决方案。
- 该问题类似于以下 SO 问题中描述的问题,其中提出了不同的解决方案:Deserialize remote object to the narrowest accessible class 在那里得到答案仍然有用。但是,该解决方案对我来说还不够,因为虽然可以限制接口,但我仍然需要一个带有额外方法的 class 实现。
事实 1. 其实我发现有一个反序列化的替代方法 Class 类型提示,即 反序列化与字符串清单.参考: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.
事实 2. 我还发现您的 Akka 不一定会为您提供类型提示。您可以通过以下方式禁用类型提示
class MyOwnSerializer extends akka.serialization.Serializer {
override def includeManifest: Boolean = false // !!!