2012-04-17 2 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 был самой тяжелой частью кода (если я помню, что это было как 15% от общего исполнения).

спросил я вокруг и нашел Gson, чтобы быть в состоянии сделать это чище, но производительность в настоящее время более 40% моего цикла сейчас (сама его Gson Thats делает это):

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, но есть ли более быстрый способ сделать это, не зависимо от каких-либо внешних библиотек, поскольку мои потребности довольно просты (если нет, то есть быстрый)? Поскольку кто-то предложил Гссона, я посмотрел на парсеров Json, но это то, что я должен искать, или есть ли другие типы библиотек, которые это делают?

EDIT: Я преобразовываю его в строку, потому что я думал, что мне нужно сделать это, чтобы отправить его как getBytes(), есть ли какой-либо другой формат, который будет быстрее, чем я могу использовать getBytes()?

+1

Вы могли бы, возможно, есть класс, который держит INT, двойной и INT [], и сериализовать/десериализовать его. – assylias

+0

Есть много более быстрых способов сделать это. Что вы делаете со струнами? то почему они нужны, потому что самый быстрый подход - не использовать их вообще. –

+0

@PeterLawrey сервер очереди (насколько мне известно) требует данных для отправки как 'getBytes()' Я думал, что мне нужно преобразовать его в строку, чтобы это сделать. –

ответ

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 и использовать родной порядок байтов. и т.д.

+0

Большое спасибо Питеру, но как его преобразовать (я могу использовать эту логику для отправки в очередь, но когда все возвращается, мне нужно преобразовать их обратно в исходный формат для обработки)? –

+0

Используйте ByteArrayInputStream для обертывания байта [] и DataInputStream, чтобы обернуть это. Затем используйте readInt/Double, где я использовал writeXxx(). –

+0

получил его, он работал для int и double, но как мне получить int [] назад? Я попытался сделать еще один readInt и получил некоторые цифры, но это было не так, как в списке. У меня есть способ получить список? –

Смежные вопросы