4

私は次のクラスを持っています:

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);、すべてが問題なく動作します。ただし、多くの種類のコンテナーを使用して、より高度なクラスを実装し始めると、これは面倒な場合があります。

私は何か間違ったことをしていますか?

4

1 に答える 1

1

kryo bind アノテーションを使用するのはどうですか:

public class QueryResults {

    @CollectionSerializer.BindCollection(
         elementClass = QueryResults.class,
         elementSerializer = DefaultSerializers.StringSerializer.class) 
    protected Set<String> resultList = new HashSet<String>();

    ...
}

追加の kryo シリアライザーのセットも確認​​してください。

于 2015-09-16T12:02:40.617 に答える