2011-10-15 71 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; 
}