簡體   English   中英

Java :(部分)類的序列化(不是對象!)

[英]Java: (Partial) Serialization of classes (not objects!)

我目前正在執行一項任務,將一個組件及其依賴項打包在一起,並從中制作出一個包含所有需要的東西的獨立組件。

我遇到的情況是,我可能也需要包含用戶定義的類,這些類也需要包含在內。

我正在尋找一種以苗條/智能的方式序列化它們的方法。 這些類例如具有繼承層次結構:

FrameWorkSuper
--------------
UserSuper 
UserClass

有沒有一種方法可以僅序列化類的用戶定義部分以使占用空間較小? 源自框架的任何內容都絕對包含在最終組件中。 因此,我想序列化並稍后僅加載整個用戶定義的部分,以使類獲得框架部分也在包中。

有什么方法可以實現這一目標,或者對此我應該使用的建議嗎?

我認為您想要做的是傳輸用戶定義類的實際字節碼。

  1. 如果您沒有類的字節碼,而只有源代碼,則需要首先對其進行編譯。 我建議使用JavaCompiler
    • 由於將所有內容編譯到磁盤然后再次將其讀取到字節數組有點繁瑣,因此您可能想使用自己的FileManager和JavaFileObject實現,因此如有必要,我可以提供有關此步驟的詳細信息。
  2. 一旦有了類的字節碼,就可以將其發送到想要的任何地方(文件,數據庫,遠程站點)。
  3. 在“反序列化”時(如其他人所述,串行化並不是正確的術語),請從任何地方加載字節碼。
  4. 創建一個自定義的類加載器,該類加載器獲取所有類的字節碼,並將其findClass方法重寫為類似

     // first try our cache of loaded classes if (loadedClasses.containsKey(name)) { return loadedClasses.get(name); } // that didn't work, maybe the class was compiled but not yet loaded if (compiledClasses.containsKey(name)) { // get the representation from the cache InMemoryClassJavaFileObject inMemoryRepresentation = compiledClasses.get(name); // let our parent define the class Class<?> clazz = defineClass(name, inMemoryRepresentation.getData(), 0, inMemoryRepresentation.getData().length); // and store it in the cache for later retrieval loadedClasses.put(name, clazz); return clazz; } 

    請注意,您不需要創建InMemoryClassJavaFileObject ,只需使用字節數組即可。

  5. 要達到上述目的,您將需要從其字節碼中獲取類的完全限定名稱。 要么單獨提供該信息,要么使用此方法

這使您可以在遠程站點上訪問類本身:您可以創建實例並使用其方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM