1

Kryonet を使用して、RMI 経由でサーバー メソッドを呼び出します。 サービスが通常の値 (true/false など) を返す場合、正常に動作しています。

しかし、サービスが例外をスローすると、無限ループが発生し、サーバーで 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 経由で例外を処理できませんか?

4

1 に答える 1

2

おそらく、それ自体を参照する原因を持つ例外があります。

この原因を処理できない場合は、KryoSerialization を初期化するときに参照を有効にする必要があります。

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

Server server = new Server(16384, 2048, serialization);
于 2016-02-01T18:16:15.233 に答える