2016-02-01 55 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項目,或者在這裏提出另一個問題 –