我需要将 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
非常感谢!!
最佳答案
将其全部写入 ByteArrayOutputStream
,周围有一个 ObjectOutputStream 来序列化 Strings 和 List,然后调用将 BAOS 转换为 byte[] 数组的方法。在另一端,执行相反的操作。
或者定义一个包含 {String, String, List}
的可序列化对象元组并用 ObjectOutputStream
序列化它,并用 ObjectInputStream
反序列化它。简单得多。
或者只发送三个。 TCP是字节流,消息之间没有边界,字节都是按顺序到达的。如果您想保留对网络的写入,请插入 BufferedOutputStream
并在写入 List
后刷新它.
关于java - 如何将两个字符串和一个 List<byte[]> 聚合为一个 byte[],然后提取它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870715/