给定一个泛型数组T[],其中T extends java.lang.Number,我想使用ByteArrayOutputStream将数组写入byte[]。java.io.DataOutput (而且像java.io.DataOutputStream这样的实现看起来很接近我所需要的,但是没有一般的方法来编写T[]数组的元素。我想做这样的事
ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(out);
for (T v : getData()) {
dataOut.write(v); // <== uh, oh
}但是在<T> void write(T v)上没有通用的DataOutput方法。
有什么办法可以避免写一大堆isntanceof意大利面吗?
澄清
byte[]被发送到一个非Java客户端,因此对象序列化不是一个选项。例如,我需要从byte[]生成的Float[]成为C语言中的有效float[]。
发布于 2010-09-21 18:17:44
不,没有。无论如何,instanceof的“意大利面”必须存在于某个地方。创建一个通用方法,用于执行以下操作:
public <T> void write(DataOutputStream stream, T object) {
// instanceofs and writes here
}发布于 2010-09-21 18:22:26
您可以只使用ObjectOutputStream而不是DataOutputStream,因为所有Number都保证是可序列化的。
发布于 2010-09-21 18:57:42
关于最后一次编辑,我会尝试这种方法(不管它是否丑陋)。
1)检查每个实例的类型
2)将其存储到原语中,并提取所需的字节(如整数),如下(前两个字节)
byte[] bytes = new byte[2];
bytes[0]=(byte)(i>>8);
bytes[1]=(byte)i;3)通过byte[]数组发送
4)陷入困境,因为不同的c实现对整数使用不同的字节数,因此没有人能够保证结果与初始数字相等。例如,如何处理带有2字节c ++整数的java的4字节整数?你怎么处理长时间的?
所以.我没办法做,但是,我不是这方面的专家.
如果我错了,请纠正我。;-)
https://stackoverflow.com/questions/3763186
复制相似问题