2012-04-17 15 views
3

私はただバイトとしてメッセージを受け取るキューサービスを使用しているので、データをフォーマットにすばやく変換し、キューから作業を受け取ったときにオリジナルに戻す必要があります。私のデータ形式は、INT、DOUBLE、およびINT []であり、ここで私が最初にデータをバイトに変換して元の形式に戻すより高速な方法はありますか?

//to convert to string 
String[] message = { Integer.toString(number), String.valueOf(double), Arrays.toString(my_list) }; 
message.asString; 
//to convert back 
String message_without_brackets = message.replace("[", "").replace("]", ""); 
String[] temp_message = message_without_brackets.split(","); 

int interger = Integer.valueOf(temp_message[0]); 
double double = Double.valueOf(temp_message[1]); 
int[] my_list = new int[temp_message.length-2]; //-2 because the first two entries are other data 

for (int i = 2; i < temp_message.length; i++) { 
    my_list[i-2] = Integer.parseInt(temp_message[i].replace(" ","")); 
} 

これは、超醜いでそれをやったし、それがあることを私に悩まさ方法です数週間後(または大量飲酒の単一夜)私はおそらくこれをすぐに把握することはできません。性能は賢明ではありませんでした。私はreplaceがコードの中で最も重い部分だと思います。

私は周りに尋ねたし、このクリーナーを行うことができるようにGsonが見つかりましたが、パフォーマンスは(そのGson自身がそれをやってthatsの)今、今、私のループの40%以上である:

Gson gson = new Gson(); 
    int[] sub = { 0, 59, 16 }; 
    Object[] values = { 0, 43.0, sub }; 
    String output = gson.toJson(values); // => [0, 43.0,[0,59,16]] 

    Object[] deserialized = gson.fromJson(output, Object[].class); 
    System.out.println(deserialized[0]); 
    System.out.println(deserialized[1]); 
    System.out.println(deserialized[2]); 

だから私は思ったんだけどもし同じ結果を得るより速い方法があれば、私はこのquestionの提案のいくつかを試していますが、私のニーズが非常に単純であるため、外部ライブラリに依存しないでこれを行うより速い方法があります速いもの)?誰かがGsonを提案したので、私はJsonパーサを調べましたが、私が探しているはずのもの、またはこれを行う他の種類のライブラリがありますか?

編集:私はそれをgetBytes()として送信する必要があると思ったため、文字列に変換していますが、他のフォーマットではより速くgetBytes()を使用できますか?

+1

toByteArray()のためにそれの価値があるストリームにそれを使用しますシリアル化/逆シリアル化します。 – assylias

+0

これを行うためのより速い方法がたくさんあります。ストリングで何をしていますか?なぜなら、最も速いアプローチはそれらをまったく使用しないためである。 –

+0

@PeterLawrey(私の知る限り)キューサーバーは 'getBytes()'としてデータを送信する必要があります。それを行うためには文字列に変換する必要があると思いました。 –

答えて

3

あなたはリサイクルたByteBuffer、あるいは直接的たByteBufferを使用して、ネイティブのバイト順序を使用することができ、より極端な取得したい場合は、

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 

int i = 0; 
double d = 43.0; 
int[] sub = { 0, 59, 16 }; 

dos.writeInt(i); 
dos.writeDouble(d); 
dos.write(sub.length); 
for (int j : sub) 
    dos.writeInt(j); 

byte[] bytes = baos.toByteArray(); 

ようDataOutputStreamをを使用することができます。

+0

Peterさん、どうもありがとうございます。どのように私はそれを元に戻すことができますか(このロジックを使用してキューに送ることができますが、復帰時に元のフォーマットに戻して処理する必要があります)。 –

+0

ByteArrayInputStreamを使用してbyte []とDataInputStreamをラップしてラップします。次に、writeXxx()を使用していた場所でreadInt/Doubleを使用します。 –

+0

それはintとdoubleのために働いていましたが、どうすればint []を得ることができますか?私は別のreadIntをやろうとしましたが、いくつかの数字がありましたが、リストに載っていたようなものではありませんでした。リストを取得する方法はありますか? –

関連する問題