2013-12-11 24 views
-2

當我將字節數組轉換爲InputStream時,它給出NotSerializableException異常。 (請參見下面的代碼)NotSerializableException異常轉換爲InputStream時

// return type of myBO.getAttachedFile() is byte[] 
InputStream inputStream = new ByteArrayInputStream(myBO.getAttachedFile()); 

我已經檢查方法myBO.getAttachedFile的回報(),它是序列化。所以我的問題是爲什麼它轉換爲InputStream後不是SERIALIZE,如下面的代碼所寫。 myBO.getAttachedFile()的返回類型是byte []

要檢查myBO.getAttachedFile()的序列化,我使用了下面的代碼。它不給例外

try { 
     new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(myBO.getAttachedFile()); 
    } catch (Exception e) { 
     logger.debug("========EXCEPTION====== Object Not Serialized"); 
     logger.debug(METHOD_NAME, e); 
    }  

當我檢查了序列化的inputStream它給下面

try { 
     new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(inputStream); 
    } catch (Exception e) { 
     logger.debug("========EXCEPTION====== Object Not Serialized"); 
     logger.debug(METHOD_NAME, e); 
    }  
+0

您發佈的代碼無法拋出該異常,除非在您未向我們顯示的地方存在隱藏的反序列化。 'NotSerializableException異常,'不是它在標題中所說的。請準確。發佈異常,消息和堆棧跟蹤。關於序列化輸入流的部分並不合理,但它並不重要。 – EJP

+0

你已經編輯了你的問題,但你只解決了小問題。沒有堆棧跟蹤,你不會得到答案。 – EJP

回答

0

您正在嘗試一個整體InputStream實例寫ObjectOutputStream代碼例外,而不是內部引用的實際資源的內容。你只能寫實現Serializable interface的實例,否則你會得到一個相當自我解釋的NotSerializableException

InputStream class確實不是實現了Serializable接口。 InputStream實例僅表示指向底層環境上打開的字節資源的指針。與byte[]實例相反,InputStream實例本身不包含任何您想要序列化的數據。 InputStream實例僅僅是底層環境上的實際字節資源(例如磁盤文件系統指針)和Java代碼之間的「信使」。它能夠將數據讀取爲byte/byte[]並將其返回,但它本身不會將它們存儲在實例中的任何位置。它沒有private byte[] alldata財產左右。

你真的不能序列化這樣的事情。資源會泄漏(所以,當你在很短的時間內這樣做時,你的環境將耗盡資源),並且當你反序列化它時,指針不一定是有效的,當然你不需要它在完全不同的環境中。

只需使用byte[]。或者,也許更好,忘記了整個序列化嘗試。根據具體的功能要求,這對於您嘗試實現的任何內容來說很可能沒有任何意義。

+0

沒有任何意義。所發佈代碼未拋出的異常;一個多餘的「證明」InputStream不可序列化,我們知道,這似乎與真正的問題沒有任何關係;在提問時未能發佈真正的例外或真實的代碼。沒有用。 – EJP