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。コードの最も重い部分だったと思います (覚えていれば、実行全体の 15% 程度でした)。

私は周りに尋ねて、Gsonがこのクリーナーを実行できることを発見しましたが、パフォーマンスは現在ループの40%を超えています(Gson自体がそれを実行しています):

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

だから私は同じ結果を得るためのより速い方法があるかどうか疑問に思っています?そうではなく、速いものはありますか)?誰かがGsonを提案したので、私はJsonパーサーを見ましたが、それは私が探しているべきものですか、それともこれを行う他のタイプのライブラリがありますか?

編集: として送信するためにそれを行う必要があると思ったので、文字列に変換しています。getBytes()使用できるより高速な他の形式はありますgetBytes()か?

4

2 に答える 2

3

次のような DataOutputStream を使用できます

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

さらに極端にしたい場合は、リサイクルされた ByteBuffers または直接 ByteBuffers を使用して、ネイティブのバイト順序を使用できます。等

于 2012-04-17T16:26:34.633 に答える
1

グアバを見たことがありますか?バイトストリームを処理するために常に使用しています

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/ByteStreams.html#toByteArray(java.io.InputStream )

ライブラリは toByteArray() のためだけに価値があります

于 2012-04-17T16:40:58.907 に答える