2014-06-12 28 views
1

我寫了一個小的測試程序,以顯示我們需要多少字節序列Integer對象:爲什麼序列化整數需要很多(81)字節?

ByteArrayOutputStream data = new ByteArrayOutputStream(); 
    try { 
     ObjectOutputStream output = new ObjectOutputStream(data); 
     output.writeObject(1); 
     output.flush(); 
     System.out.println(data.toByteArray().length); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

但是,結果是令人驚訝的,它需要81個字節。如果我序列化String「1」,它只需要8個字節。我知道java已經對String序列化進行了優化,但爲什麼不爲Integer做同樣的事情?我認爲這不應該很困難。

還是有人有一些解決方法?我需要一個可以序列化所有對象和基本類型的方法。謝謝你的回答!

+0

如果您調用writeInt而不是writeObject會發生什麼?這應該避免自動裝箱int。 – bstar55

回答

4

這是一個平衡的行爲,通過讓直接支持很多類型,以及保持簡單之間使序列化協議更復雜。

以我的經驗,Integer值與int值比較是比較少見的 - 而後者確實有內置的支持下,與所有其他基本類型一起。同樣值得注意的是,雖然序列化一個對象是昂貴的,但增量成本要小得多,因爲已經有一個對流中類的引用。因此,在寫完第一個Integer之後,新的Integer只需要10個字節 - 並且已經寫入該流的Integer的引用(如果您正在裝入小值,則通用)僅爲5個字節。

就我個人而言,我會嘗試避免原生Java二進制序列化 - 無論如何 - 它是平臺特有的,非常脆弱,而且不是非常緊湊。我喜歡Protocol Buffers,但也有很多其他的選擇。

相關問題