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 回答