用kryo注册课程的策略



我最近发现了kryonet库,它非常棒,非常适合我的需求。

然而,我遇到的一个问题是开发一个好的策略来注册所有可以转移的类。

我知道我可以在每个对象中编写一个静态方法,它将返回它所使用的所有类的列表,但我真的不想这样做(为了我自己的时间目的,以及那些将扩展这些对象的人)。

我正在玩,试图看看是否有一种方法获得所有的类,一个对象引用(在它的字段以及它的继承)从getClass()方法,但我无法有任何成功。

最后,我知道,kryo有kryo. setreregistrationoptional(真),但我有一个非常困难的时间试图找出如何使用它。当这个选项打开时,如果我没有注册类,kryo似乎仍然会抛出异常。而且,这个方法比注册所有类要慢得多。如果你第一次需要使用这个方法发送对象时速度很慢,我可以接受,但是我不知道我是否可以接受每次我想要发送对象时严重的性能下降。

理想情况下,我将有一个想要使用kryonet发送的对象包。如果只需要扫描这个包并确定我需要注册的所有类,那就太好了。现在,并不是所有的客户端都需要注册每个对象,但这是一个单独的问题,我不知道是否有解决方案。

如果有人能给我指个方向就太好了。

类可能来自不同的地方,如磁盘、网络、内存(动态生成)。因此,获取要在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;
}

最新更新