Java Kryonet RMI抛出异常=>;循环(堆栈溢出错误)

Java Kryonet RMI抛出异常=>;循环(堆栈溢出错误),java,service,rmi,kryo,kryonet,Java,Service,Rmi,Kryo,Kryonet,我们使用Kryonet通过RMI调用服务器方法。 如果服务返回正常值(如true/false),则工作正常。 但是当服务抛出异常时,我们会得到一个无休止的循环,导致服务器上出现StackOverflower错误 Exception in thread "Server" java.lang.StackOverflowError at com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:472) at com.esotericsoftwa

我们使用Kryonet通过RMI调用服务器方法。 如果服务返回正常值(如true/false),则工作正常。

但是当服务抛出异常时,我们会得到一个无休止的循环,导致服务器上出现StackOverflower错误

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;
所有课程都在kryo注册

  • 服务
  • 例外情况
  • 类型

Kryonet不能通过RMI处理异常吗?

您可能有一个异常,其原因引用了自身

如果无法处理此原因,则应在初始化KryoSerialization时启用引用

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

Server server = new Server(16384, 2048, serialization);

抛出异常
不是很有想象力。你应该定义一个特殊的
LoginException
或者这个接口抛出的任何东西,然后抛出它。当然,我只是在文章中简化了它。这解决了问题!-但它仍然不起作用。否我们在客户端上遇到反序列化错误:
原因:com.esotericsoftware.kryo.KryoException:无法创建类(缺少任何参数构造函数):java.util.Collections$UnmodifiableRandomAccessList
这不相关。您可以查看kryo serializers项目,或者在这里问另一个问题