2011-03-13 14 views
1

我有一個接口MigrateScenario及其方法。我也有它的實現MigrateScenarioImpl。 MigrateScenarioImpl的實例正在序列化,然後作爲byte []傳遞給某個Web服務。在服務方面,當我嘗試這樣做:接口是不夠的,他們背後的對象工作?

Object obj = (new ObjectInputStream(digitalObject.getContent().getInputStream())).readObject(); 
MigrateScenario mgrScenario = (MigrateScenario) obj; 

和我所得到的是MigrateScenarioImpl類是在classpath中失蹤。 obj變量包含該對象,並且該接口應該盲目地詢問相應的方法,因爲該對象「知道自己」如何執行它們。但是,當我將MigrateScenarioImpl添加到類路徑時,則所有工作都正常。我在這裏錯過了什麼嗎? 將不勝感激任何幫助,謝謝!

+0

我不使用Java,但.NET中的類似代碼很簡單。不知道你在做什麼錯... – 2011-03-13 22:50:37

+0

@merlyn我不會感到驚訝,如果.NET發送實施以及對象。聽起來像是它會做的事情。 – corsiKa 2011-03-13 22:54:08

+0

@ glowcoder,John_Doe:其實我錯了。我在同一個應用程序中考慮過...在服務範圍內,你失去了所有的實現信息,所以我不希望它以任何語言工作。 – 2011-03-13 23:01:43

回答

1

如果沒有類加載器已知的類(例如通過類路徑),則無法反序列化類。類本身的代碼不是序列化的,預計在另一端是已知的。

+0

這是正確的,它節省了字段,但不是代碼。所以沒有辦法在另一端知道如何readObject,謝謝。 – 2011-03-13 22:53:54

2

只知道接口並不能幫助JVM知道該怎麼做。它需要Impl來知道該做什麼,而不僅僅是可用的方法。

+0

是的,你需要雙方的impl類。我不能說其他語言,對不起:-( – corsiKa 2011-03-13 22:52:00

1

當您反序列化對象時,Java需要在類的實例中實例化和初始化。接口不能被實例化,所以Java必須實例化實現類。類的序列化包含實例數據(非瞬態實例變量的值),而不是實現方法的代碼,因此沒有接口指向的方法。

+0

對,右...愚蠢的問題:D – 2011-03-13 22:52:14