2012-04-20 88 views
0

我試圖通過從Serializable接口切換到Externalizable來改善我們當前的序列化性能,但沒有找到關於創建自定義和高性能序列化的最佳實踐的大量文檔。我目前的解決方案速度是Java序列化庫存的兩倍,雖然不錯,但看起來並不像我期待的那麼大的改進(Benchmark of serialization techniques/librariesJava自定義序列化最佳實踐

對於除原語之外的任何事情,我採取了寫0或1顯示的字段存在,然後讀取字段,如果值是1:

if (in.read() == 1) { 
    name = in.readUTF(); 
} 

關於是否正確的聲音?是否有更好的編碼使用?地圖,列表和其他複雜的數據結構如何? Enums的默認序列化是否正確?

謝謝。

回答

2

任何不使用現有序列化框架的理由 - 但是比Java內置的更好嗎?我自己的偏好是Protocol Buffers,但也有替代品,如Thrift。我會盡量避免做你自己的低級序列化,除非你真的無法避免它。您鏈接的頁面顯示批次的替代品。

您應該考慮性能的可維護性。雖然Externalizable可以給你很好的表現,最終取決於你如何實現它 - 並且你可以做得很好,或者做得不好,但這都是手動的。

+0

該計劃實際上是評估一些可能的方式,並根據性能和可維護性查看我們最喜歡哪一種。我們不需要其中許多提供的跨語言支持,所以自定義Java代碼看起來像是一種可能性。 – Gandalf 2012-04-20 16:44:42

0

從可維護性的角度來看,我嘗試使用生成的數據傳輸對象。通過這種方式,您可以從單個定義中生成toString,hashCode,equals,readObject,writeObject以及可能的Builder類。

就速度而言,它取決於您的原始數據類型。有在反序列化/反序列化三個主要的成本

  • 使用反射,這是自定義序列化的主要好處,因爲你可以硬編碼的領域和類型
  • 創建新的對象。您可以使用回收的對象,但這可能會非常棘手。
  • 您讀取/寫入的字節數。使用更緊湊的表單可以提供幫助