Исключение Kryonet RMI throw =› loop (StackOverflowError)

Мы используем Kryonet для вызова методов сервера через RMI. Если служба возвращает нормальное значение (например, true/false), она работает нормально.

Но когда служба выдает исключение, мы получаем бесконечный цикл, приводящий к StackOverflowError на сервере.

Exception in thread "Server" java.lang.StackOverflowError
at com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:472)
at com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:97)
at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:517)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:76)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)

Обслуживание:

public class AuthServiceImpl extends BaseServiceImpl implements AuthService {

public boolean checkLogin(String username, String password) throws Exception {
    // ...
    throw new Exception("Test");
}

}

Звонок клиенту:

Boolean state = null;
try {
    state = service.checkLogin("Test", "password");
} catch (Exception e) {
    // Login Faild
    // ...
}
return state;

Все классы зарегистрированы в крио.

  • обслуживание
  • Исключения
  • Типы

Разве Kryonet не может обрабатывать исключения по RMI?


person Kevin Urbainczyk    schedule 01.02.2016    source источник
comment
throws Exception не очень изобретателен. Вы должны определить специальный LoginException или что-то еще, что будет выброшено этим интерфейсом, и выбросить его.   -  person user207421    schedule 01.02.2016
comment
Конечно, я просто упростил это для поста.   -  person Kevin Urbainczyk    schedule 02.02.2016


Ответы (1)


Вероятно, у вас есть исключение с причиной, которая ссылается на себя.

Если вы не можете справиться с этой причиной, вам следует включить ссылки при инициализации KryoSerialization.

Kryo kryo = new Kryo();
kryo.setReferences(true);
KryoSerialization serialization = new KryoSerialization(kryo);

Server server = new Server(16384, 2048, serialization);
person Jérémie B    schedule 01.02.2016
comment
Это решило проблему! - Но он все еще не работает. Нет, мы получили ошибку десерилизации на клиенте: Caused by: com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): java.util.Collections$UnmodifiableRandomAccessList - person Kevin Urbainczyk; 02.02.2016
comment
Это не связано. Посмотреть проект крио-сериализаторов или задать другой вопрос можно здесь - person Jérémie B; 02.02.2016