0

私は最近、ライブラリkryonetを発見しました。これは非常に素晴らしく、私のニーズに非常によく適合しています。

しかし、私が抱えている問題の1つは、転送可能なすべてのクラスを登録するための優れた戦略を開発することです。

使用するすべてのクラスのリストを返す静的メソッドを各オブジェクトに記述できることは知っていますが、実際にはそうする必要はありません(私自身の時間の目的と、これらのオブジェクトを拡張します)。

オブジェクトが参照するすべてのクラス(フィールドと継承)をgetClass()メソッドから取得する方法があるかどうかを試してみましたが、成功しませんでした。

最後に、kryoにはkryo.setRegistrationOptional(true)があることを知っていますが、それを使用する方法を理解しようとすると非常に苦労しています。このオプションをオンにしても、クラスを登録していない場合でもkryoは例外をスローするようです。また、想定されるこのメソッドは、すべてのクラスを登録できるよりもはるかに低速です。このメソッドを使用して初めてオブジェクトを送信する必要があるのが遅い場合は問題ありませんが、オブジェクトを送信するたびにパフォーマンスが大幅に低下しても問題ないかどうかはわかりません。

理想的には、kryonetを使用して送信したいオブジェクトのパッケージがあります。そのパッケージをスキャンして、登録する必要のあるすべてのクラスを判別するだけであれば、それは素晴らしいことです。すべてのクライアントがすべてのオブジェクトを登録する必要があるわけではありませんが、それは別の問題であり、その解決策があるかどうかはわかりません。

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです。

4

1 に答える 1

2

クラスは、ディスク、ネットワーク、メモリ (動的に生成される) など、さまざまな場所から取得される場合があります。したがって、Kryo に登録するクラスに関する情報の取得は、特定のケースごとに個別に処理する必要があります。

jar ファイルからクラスを読み取ることができる場合は、次のスニペットから始めてください。

private static List<Class<?>> getFromJarFile(final String jar, final String packageName)    throws ClassNotFoundException, IOException {
    final List<Class<?>> classes = new ArrayList<Class<?>>();
    final JarInputStream jarFile = new JarInputStream(new FileInputStream(jar));
    JarEntry jarEntry = null;
    do {
        jarEntry = jarFile.getNextJarEntry();
        if (jarEntry != null) {
            String className = jarEntry.getName();
            if (className.endsWith(".class")) {
                className = className.substring(0, className.lastIndexOf('.')); // strip filename extension
                if (className.startsWith(packageName + "/")) {  // match classes in the specified package and its subpackages       
                    classes.add(Class.forName(className.replace('/', '.')));
                }
            }
        }
    } while (jarEntry != null);
    return classes;
}
于 2012-04-18T15:50:35.610 に答える