0

我最近发现了图书馆 kryonet,它非常棒,非常适合我的需要。

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

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

我一直在尝试查看是否有一种方法可以从 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 回答