2016-02-01 77 views
1

我们使用Kryonet通过RMI调用服务器方法。 如果服务返回正常值(如true/false),它工作正常。Kryonet RMI抛出异常=>循环(StackOverflowError)

但是,当服务抛出异常,我们得到一个无限循环导致服务器上的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; 

所有类都注册在KRYO。

  • 服务
  • 例外
  • 类型

不能Kryonet处理超过RMI异常?

+0

'抛出Exception'并不是很有想象力。你应该定义一个特殊的'LoginException'或者这个接口抛出的东西,然后抛出它。 – EJP

+0

当然,我只是简化它的帖子。 –

回答

2

你可能有一个例外,它引用它自己的原因。

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

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

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

这已经解决了这个问题! - 但它仍然没有工作。不,我们得到了客户端上的deserilize错误:'引起:com.esotericsoftware.kryo.KryoException:无法创建类(缺少无参数构造函数):java.util.Collections $ UnmodifiableRandomAccessList' –

+0

这与此无关。你可以看看kryo-serializers项目,或者在这里提出另一个问题 –