2009-07-28 60 views
0

在寫入消息時,我想記下數據後面跟着數據的字節數。自定義Java消息序列化

消息格式:

{num of bytes in data}{data} 

我可以通過將數據寫入到臨時byteArrayOutput流,然後從它獲得字節數組的大小,寫入大小,接着將字節數組做到這一點。這種方法涉及很多開銷,即。不必要地創建臨時字節數組,創建臨時數據流等。

我們是否有更好的方法(考慮CPU和垃圾創建)來實現這一點?

+0

你如何將數據存儲起始?你從哪裏得到它? – 2009-07-28 12:24:26

回答

1

一個典型的方法是引入一個可重複使用的ByteBuffer。例如:

ByteBuffer out = ... 

int oldPos = out.position(); // Remember current position. 
out.position(oldPos + 2); // Leave space for message length (unsigned short) 

out.putInt(...); // Write out data. 

// Finally prepend buffer with number of bytes. 
out.putShort(oldPos, (short)(out.position() - (oldPos + 2))); 

一旦緩衝器被填充你可以然後經使用SocketChannel.write(ByteBuffer)(假設你使用NIO)線發送數據。

0

下面是我要做的,按照喜好。

  1. 不要擔心內存消耗和東西。很可能,這已經是最佳解決方案,除非需要大量時間來創建數據的字節表示形式,以便創建兩次是明顯的影響。
  2. (其實這更像我的清單中的#37,#2到#36是空的。)在你所有的數據對象中包含一個方法,它可以計算字節表示的大小,並佔用比它少的資源會創建字節表示。
+0

@Bombe:將有關協議表示的代碼與每個對象的業務邏輯混合在一起。我更喜歡有獨立的類來處理協議編碼/解碼。這意味着我可以獨立於我的業務對象更改協議,並可能支持多種協議。 – Adamski 2009-07-28 12:29:47