【发布时间】:2011-12-13 19:37:34
【问题描述】:
我需要将 2 个字符串和一个列表聚合成一个 byte[] 以便通过网络发送(使用具有函数 send(byte[]) 的特殊库。
然后,在另一端,我需要取回 3 个不同的对象。
我做了一个丑陋的实现,但它很慢。基本上,我所做的是
public byte[] myserializer(String dataA, String dataB, List<byte[]> info) {
byte[] header = (dataA +";" + dataB + ";").getBytes();
int numOfBytes = 0;
for (byte[] bs : info) {
numOfBytes += bs.length;
}
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o;
try {
o = new ObjectOutputStream(b);
o.writeObject(info);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] data = b.toByteArray();
int length = header.length + data.length;
byte[] headerLength = (new Integer(header.length)).toString()
.getBytes();
byte[] pattern = ";".getBytes();
int finalLength = headerLength.length + pattern.length + length;
byte[] total = new byte[finalLength];enter code here
total = // Copy headerLength, header and total into byte[] total
return return;
本质上,我正在创建一种看起来像这样的框架
HEADER INFO
(---------------------------------------------- -)(----------------------------------) HEADER_LENGHT;DATA_A;DATA_B;SERIALIZED_LIST_OBJECT
然后,在接收方,我执行逆过程,这就是“全部”。这行得通,但效率低下且丑陋。
建议?最佳实践?想法?
哦...再多提一点:这也适用于 J2SE 和 Android
非常感谢!
【问题讨论】:
-
可能,序列化是性能成本的重要组成部分。所以你可能想自己序列化列表。一个明显的问题是字节数组之间的分隔符。如果您知道有任何字节不会在数组中,则可以简化此操作。否则,您必须使用某种转义。
-
是的,这就是我想要做的,但它有点复杂。我不能对 INFO 块使用任何分隔符,因为它可以是二进制数据。我正在考虑将列表元素的数量及其长度作为标题的一部分添加......这样你就不需要分隔符了。我尝试了这种方法,但它以意大利面条代码结束。我选择的答案,它试图做到这一点,但以一种更简洁的方式!
标签: java android sockets io bytearray