Kryonet RMI 抛出异常 => 循环 (StackOverflowError)
Kryonet RMI throw exception => loop (StackOverflowError)
我们使用 Kryonet 通过 RMI 调用服务器方法。
如果服务 returns 为正常值(如 true/false),则它工作正常。
但是当服务抛出异常时,我们会陷入无限循环,从而导致服务器出现 WhosebugError。
Exception in thread "Server" java.lang.WhosebugError
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);
我们使用 Kryonet 通过 RMI 调用服务器方法。 如果服务 returns 为正常值(如 true/false),则它工作正常。
但是当服务抛出异常时,我们会陷入无限循环,从而导致服务器出现 WhosebugError。
Exception in thread "Server" java.lang.WhosebugError
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);