【问题标题】:Kryonet RMI throw exception => loop (StackOverflowError)Kryonet RMI 抛出异常 => 循环 (StackOverflowError)
【发布时间】:2016-02-01 17:12:31
【问题描述】:

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

但是当服务抛出异常时,我们会得到一个无限循环,导致服务器上出现 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 处理异常吗?

【问题讨论】:

  • throws Exception 不是很有想象力。你应该定义一个特殊的LoginException 或者这个接口抛出的任何东西,然后抛出它。
  • 当然,我只是为帖子简化了它。

标签: java service rmi kryo kryonet


【解决方案1】:

您可能有一个引用自身的原因的异常。

如果你不能处理这个原因,你应该在初始化 KryoSerialization 时启用引用。

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

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

【讨论】:

  • 这已经解决了问题! - 但它仍然无法正常工作。不,我们在客户端收到反序列化错误:Caused by: com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): java.util.Collections$UnmodifiableRandomAccessList
  • 这不相关。你可以看看 kryo-serializers 项目,或者在这里问另一个问题
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2013-09-28
  • 2013-06-23
  • 1970-01-01
  • 2013-03-17
相关资源
最近更新 更多