2009-07-28 23 views
0

メッセージをワイヤで書き込んでいる間、データのバイト数をデータに書き留めます。メッセージのカスタムjavaシリアル化

メッセージ形式:

{num of bytes in data}{data} 

私は一時的なbyteArrayOutputストリームにデータを書き込み、それからバイト配列のサイズを取得し、バイト配列に続いてサイズを書き込むことによってこれを行うことができます。このアプローチには多くのオーバーヘッドが必要です。一時的なバイト配列の不要な作成、一時的なストリームの作成など。

これを達成するには(CPUとガーベージの両方の作成を考慮して)より良い方法がありますか?

+0

どのようにデータを保存しておくのですか?あなたはどこから手に入れていますか? –

答えて

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))); 

バッファが移入されたら、次に(あなたがNIOを使用していると仮定して)SocketChannel.write(ByteBuffer)を用いたワイヤを介してデータを送信することができます。

0

ここでは、好みの順に説明します。

  1. メモリの消費量については気にしないでください。データのバイト表現を作成するのに多くの時間がかかる場合を除いて、これはすでに最適な解決策である可能性が高いため、2回作成することは顕著な影響を与えます。
  2. (実際にはこれは私のリストで#37のほうが空いています#2〜#36は空です)バイト表現のサイズを計算し、それよりも少ないリソースを使用するすべてのデータオブジェクトにメソッドを組み込みますバイト表現を作成します。
+0

@Bombe:これは、ワイヤプロトコル表現に関係するコードを、各オブジェクトのビジネスロジックとミックスします。私は、プロトコルのエンコーディング/デコードを処理するために別々のクラスを持つことを大いに好みます。つまり、ビジネスオブジェクトとは独立してプロトコルを変更でき、複数のプロトコルをサポートする可能性があります。 – Adamski

+0

これは、すでにいくつかのエンコーダ/デコーダクラスがあることを意味しますか?その場合は、getLength()メソッドをそれらの整数で整列させてください。さもなければ、バイト配列に最初に(上記のように 'ByteArrayOutputStream'または' ByteBuffer'を使って)オブジェクトを書き込む以外の選択肢はありません。 – Bombe

+0

ありがとうボンビー。これは私が試した解決策です。しかし、私はまた、Javaオブジェクトのシリアライゼーションをサポートしたいと私は書くすべてのオブジェクトのカスタムシリアル化を書いたくありません。 – baskin

関連する問題