2016-02-08 2 views
1

Проблема/Контекст. Мне нужно отправить некоторые сообщения удаленному игроку. Эти сообщения могут содержать объекты класса, которые неизвестны на стороне получателя. И мне нужно перехватить такую ​​ситуацию, чтобы избежать исключения ClassNotFoundException.Akka Удаленный доступ и перехват неизвестных классов посредством пользовательской десериализации

Одно решение может состоять в перехвате неизвестных классов во время десериализации сообщений. Затем сообщение может быть заменено другим сообщением уровня приложения, чтобы удаленный актер мог сообщить отправителю, что у него нет необходимых классов.

Я не знаю, если такой перехват возможен, потому что обычай де/serializators должен реализовать akka.serialization.Serializer, которая имеет следующий метод

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

Теперь проблема проистекает из строительства Объекты класса (который делается от Akka) для объектов неизвестного класса.

Есть ли способ настроить десериализацию Akka на нижнем уровне, чтобы удовлетворить мои потребности?

Другие решения.

  • Проблема аналогична той, изображенной на следующей SO вопрос, где была предложена другое решение: Deserialize remote object to the narrowest accessible class все еще было бы полезно иметь там ответ. Однако этого решения было бы недостаточно для меня, потому что, хотя было бы нормально ограничивать интерфейс, мне все равно понадобилась бы реализация класса с дополнительными методами.
+0

Возможно, вы захотите проверить 'kryo'. – Helios

+0

@ Ник, не могли бы вы объяснить, почему? Насколько я понимаю, Kryo - это просто структура сериализации. Имеет ли он некоторые особенности, которые мне помогают? – metaphori

ответ

0

ФАКТ 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.

ФАКТ 2. Я также обнаружил, что вы, Акка, не обязательно предоставляете вам подсказку типа. Вы можете отключить подсказку типа следующим образом:

class MyOwnSerializer extends akka.serialization.Serializer { 
    override def includeManifest: Boolean = false // !!! 
Смежные вопросы