2016-05-14 2 views
1

Есть ли способ отправить сообщения, набранные с помощью моих собственных классов, удаленному игроку?
Например, я хотел бы иметь возможность получить в моем удаленном актере сообщение так:Есть ли способ отправить сообщения, набранные с помощью моих собственных классов, удаленному актеру Akka?

case myClass: MyClass => doSomething() 

Но я получаю ошибку local class incompatible потому что serialVersionUID различны.

Единственный способ отправить сообщение типа MyClass, которое я нашел, это сериализовать его в Json. Но мне приходится сериализовать/десериализовать его, и более проблематично, у меня нет чистого способа получить два типа типизированных сообщений ...

Так есть способ отправить строго типизированные сообщения удаленному игроку? Если нет, каков обходной путь?

+0

Похоже, ваш есть 2 разные версии в классе путей ваших актеров. Проверьте classpaths и определите явное значение 'serialVersionUUID' –

+0

« Сильно напечатанный, я имею в виду типизированный с моими собственными классами »- вы, вероятно, должны перефразировать, потому что это не то, что это значит для кого-либо еще –

+0

@ChrisMartin. Каким будет правильное имя для этого ? – Simon

ответ

6

Вы, безусловно, может!

При отправке объектов по сети они должны быть превращены в байты на одном конце и возвращены в объекты на другом конце. Это называется «Сериализация».

В Akka механизм сериализации, используемый для сообщений, перемещающихся из одной системы актеров в другую, очень настраивается: вы не должны делать это в своих собственных актерах, но оставьте его до инфраструктуры сериализации Akka (и настройте это по своему вкусу) ,

По умолчанию akka использует встроенную «сериализацию Java». Это в основном работает, но, как вы заметили, довольно разборчиво о том, чтобы иметь тот же самый класс по обе стороны от соединения. Кроме того, это не особенно быстро. Вы должны были видеть предупреждение в протоколирования:

Использование Java сериалайзер по умолчанию для класса [{}], не рекомендуется из-за влияния на производительность. Используйте другой сериалайзер или отключить это предупреждение, используя настройку akka.actor.warn-о-Java-сериализатор-использование

Чтобы устранить проблему, вы можете либо:

  • Продолжайте использовать Java сериализацию, и, по крайней мере, зафиксировать serialVersionUID, как описано в ответе Виталия.
  • Переключитесь на другой механизм сериализации, такой как Protobuf.

Если вы не слишком заботитесь о производительности и не ожидаете делать «перекатные обновления» (там, где вам может потребоваться преобразовать разные версии одного и того же сообщения), сериализация Java, безусловно, самая простая. Однако важно знать об ограничениях.

Дополнительная документация о том, как настроить механизмы сериализации AKKA можно найти на http://doc.akka.io/docs/akka/current/scala/serialization.html#serialization-scala

1

От Serializablejavadoc:

настоятельно рекомендуется, чтобы все сериализуемые классы явно объявить, то значения serialVersionUID, так как по умолчанию serialVersionUID вычисление очень чувствительно к деталям класса, которые могут изменяться в зависимости от реализации компилятора и может привести к неожиданным InvalidClassExceptions во время десериализации.

Таким образом, вы должны определить serialVersionUID в классах сообщений, как это:

@SerialVersionUID(42L) 
class Message extends Serializable 
Смежные вопросы