私は次のクラスを持っています:
public class QueryResults {
protected Set<String> resultList = new HashSet<String>();
protected long executionTime = 0;
public long getExecutionTime() { return executionTime; }
[...]
}
そして、私はそれを次のように登録します:
Registrar.RegisterClass(this, QueryResults.class);
------------
public class Registrar {
public static void RegisterClass(Node n, Class theClass) {
Map<String, Node> nodeMap = Node.getNodeMap();
for (Map.Entry<String, Node> node : nodeMap.entrySet()) {
if (node.getKey().equals(n.getHostname())) {
Log.info("Registering " + theClass.getSimpleName() + " for " + node.getValue().getHostname());
node.getValue().getServer().getConnection().getKryo().register(theClass);
node.getValue().getClient().getConnection().getKryo().register(theClass);
}
}
}
}
QueryResults
これは、コンテナ (この場合は a) が含まれているため、シリアライズを試行するまではうまく機能していましたHashSet
(同様に a も試しましたArrayList
が、同じ結果が得られました)。
エンドポイントでこのクラスにデータを入力し、最終的にシリアル化して呼び出し元に送り返すと、次の出力が得られます。
Exception in thread "Server" com.esotericsoftware.kryo.KryoException: java.lang.IllegalArgumentException: Class is not registered: java.util.HashSet Note: To register this class use: kryo.register(java.util.HashSet.class);
を明示的に呼び出すとRegistrar.RegisterClass(this, HashSet.class);
、すべてが問題なく動作します。ただし、多くの種類のコンテナーを使用して、より高度なクラスを実装し始めると、これは面倒な場合があります。
私は何か間違ったことをしていますか?