在寫入消息時,我想記下數據後面跟着數據的字節數。自定義Java消息序列化
消息格式:
{num of bytes in data}{data}
我可以通過將數據寫入到臨時byteArrayOutput流,然後從它獲得字節數組的大小,寫入大小,接着將字節數組做到這一點。這種方法涉及很多開銷,即。不必要地創建臨時字節數組,創建臨時數據流等。
我們是否有更好的方法(考慮CPU和垃圾創建)來實現這一點?
在寫入消息時,我想記下數據後面跟着數據的字節數。自定義Java消息序列化
消息格式:
{num of bytes in data}{data}
我可以通過將數據寫入到臨時byteArrayOutput流,然後從它獲得字節數組的大小,寫入大小,接着將字節數組做到這一點。這種方法涉及很多開銷,即。不必要地創建臨時字節數組,創建臨時數據流等。
我們是否有更好的方法(考慮CPU和垃圾創建)來實現這一點?
一個典型的方法是引入一個可重複使用的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)線發送數據。
下面是我要做的,按照喜好。
@Bombe:將有關協議表示的代碼與每個對象的業務邏輯混合在一起。我更喜歡有獨立的類來處理協議編碼/解碼。這意味着我可以獨立於我的業務對象更改協議,並可能支持多種協議。 – Adamski 2009-07-28 12:29:47
你如何將數據存儲起始?你從哪裏得到它? – 2009-07-28 12:24:26