2011-10-15 68 views
0

我最近发现了图书馆kryonet,它非常棒,非常适合我的需求。用kryo注册课程的策略

但是,我遇到的一个问题是制定一个好的策略来注册所有可以传输的类。

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

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

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

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

如果有人能指出我的方向是非常好的。

回答

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; 
}