2011-01-28 35 views
0

缺省情況下,InputStream未被序列化。如何通過RMI傳遞InputStream來訪問EJB?如何通過RMI傳遞InputStream?

+0

可能重複的[如何發送inputStream對象到Java EJBean?](http://stackoverflow.com/questions/1862914/how-to-send-an-inputstream-object-到Java-EJBean中) – Thilo 2011-01-28 05:15:10

回答

3

您必須將數據讀入字節數組,或者將數據全部寫入一個數組,或者寫入多個數據(取決於正在讀取的數據的大小),然後將這些字節數組傳遞給RMI。尚未讀取的InputStream不是可以直接傳遞的數據。

3

你不能。想象一下,InputStream從磁盤讀取文件,然後將其作爲方法參數發送給另一臺機器上的JVM上執行的EJB。在另一臺機器上反序列化時,沒有辦法使InputStream有意義。

你需要考慮潛在的問題而不是機制。你需要將InputStream讀入一個可序列化的對象(比如一個byte []數組)並傳遞它。

如果InputStream讀取的內容太大,則需要將其包裝在一個Serializable對象中,傳遞該對象,並讓該Object能夠在另一端創建InputStream(假設它可以)當然 - 否則你必須創建自己的流,這是一個完整的其他問題)。

2

在他的回答@Konstantin寫道:

一個尚未閱讀的InputStream是不是可以直接傳遞數據。

準確!

例如,如果您嘗試爲調用爲「java app </usr/bin/yes」的應用程序序列化System.in的內容,您會發生什麼? (提示:讀取「man yes」)

如果要跨RMI「傳遞」流,可以通過創建實現Stream API的包裝類來實現,並對原始流對象執行RMI回調讀取或寫入數據。您需要安排流封裝的序列化狀態包含一個執行回調的句柄。

但是,您的客戶端顯式讀取整個流內容並將其作爲字節(或字符)數組或緩衝區傳遞到服務器會更明智。

2

這就像試圖通過電話線發送電話。它沒有任何意義,