2012-04-20 23 views
0

shared.jar我:反序列化遠程對象最窄訪問類

abstract class MyParent { 

} 
abstract class MyClass { 
    MyParent getFoo(); 
} 

的server.jar包含

abstract class MyChild extends MyParent { 

} 
abstract class MyClassConcrete { 
    MyParent getFoo() {return new MyChild();} 
} 

client.jar中

MyParent foo = myClass.getFoo(); 

如果所有3個罐子都在一個類加載器中,一切運行良好。

但是客戶機和服務器位於不同的JVM而:

  • JVM-1包含:的server.jarshared.jar
  • JVM-2包含:client.jar中shared.jar

客戶端打電話給服務器。服務器返回MyConcreteClass和Java無法反序列化它(ClassNotFoundException)。


我想做的事:

  • 服務器序列化類和發送數據,並設置類的祖先
  • 客戶發現它可以反序列化最窄的祖先。

而且一切正常:我們在客戶端上MyParent的實例,這就是我們所需要的。

我不敢相信沒有這樣的引擎。你知道嗎? 我確信遠程通話應儘可能與本地通話相似。

謝謝。

+0

你在談論Dynamic Proxies嗎? http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/reflect/Proxy.html – mazaneicha 2012-04-20 17:47:34

回答

0

其實我發現的解決方案,並提出了特殊的包來支持它:

  • MyParent已經給我打上特殊SerializableParent註解。此註釋表示在遠程處理引擎可序列化並通過線路傳輸它之前,應將任何子類別「轉換」爲MyParent。通過設置此註釋,不僅可以告訴系統MyParent存在於遠程JVM上,而且層次結構樹也不需要多態:如果子級覆蓋父級方法,則它不會在遠程系統上可用,因爲只能發送數據而不是代碼。
  • 發送結果引擎應該找到最窄的祖先標註爲SerializableParent應該被序列化到XML(使用XStream爲例)和反序列化回用父類的別名孩子
  • 對象之前。爲了防止「未知字段」錯誤,Xstream必須被覆蓋wrapMappershouldSerializeMember
  • 你有「序列化父」要傳輸
0

實現java.io.Serializable接口可以使用writeReplace()和的readResolve()方法來替代一個被序列化的另一個對象的對象/反序列化。我可以看到這被用來解決你的問題。不過,我自己並沒有嘗試過。