从Java泛型T[]写入数据输出流?

从Java泛型T[]写入数据输出流?,java,generics,Java,Generics,给定一个通用数组T[],其中T扩展了java.lang.Number,我想使用ByteArrayOutputStream将该数组写入一个字节[]。java.io.DataOutput和java.io.DataOutputStream之类的实现看起来很接近我所需要的,但是没有通用的方法来编写T[]数组的元素。我想做一些像 ByteArrayOutputStream out = new ByteArrayOutputStream(); DataOutputStream dataOut = new D

给定一个通用数组T[],其中T扩展了java.lang.Number,我想使用ByteArrayOutputStream将该数组写入一个字节[]。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
}
但在DataOutput上没有通用的void writeT v方法

有什么办法可以避免写一大堆意大利面条

澄清

字节[]被发送到非Java客户端,因此对象序列化不是选项。例如,我需要从浮点[]生成的字节[]在C中是有效的浮点[]。

不,没有。不管怎样,意大利面条的例子肯定存在于某个地方。创建一个通用方法,该方法可以:

public <T> void write(DataOutputStream stream, T object) {
   // instanceofs and writes here
}
不,没有。不管怎样,意大利面条的例子肯定存在于某个地方。创建一个通用方法,该方法可以:

public <T> void write(DataOutputStream stream, T object) {
   // instanceofs and writes here
}

您可以只使用ObjectOutputStream而不是DataOutputStream,因为所有数字都保证是可序列化的。

您可以只使用ObjectOutputStream而不是DataOutputStream,因为所有数字都保证是可序列化的。

关于上一次编辑,如果不美观,我会尝试这种方法

每个实例检查一次您拥有的类型 2将其存储到一个原语中,并提取前两个字节所需的字节,如整数

    byte[] bytes = new byte[2];
    bytes[0]=(byte)(i>>8);
    bytes[1]=(byte)i;
3通过字节[]数组发送 4陷入困境,因为不同的c实现对整数使用不同的字节数,所以没有人能保证结果将等于您的初始数。e、 你想如何处理java的4字节整数和c的2字节整数?你怎么处理长时间

所以…我看不出有什么办法,但是,我不是这方面的专家


如果我错了,请纠正我-

关于最后一次编辑,如果它丑陋与否,我会尝试这种方法

每个实例检查一次您拥有的类型 2将其存储到一个原语中,并提取前两个字节所需的字节,如整数

    byte[] bytes = new byte[2];
    bytes[0]=(byte)(i>>8);
    bytes[1]=(byte)i;
3通过字节[]数组发送 4陷入困境,因为不同的c实现对整数使用不同的字节数,所以没有人能保证结果将等于您的初始数。e、 你想如何处理java的4字节整数和c的2字节整数?你怎么处理长时间

所以…我看不出有什么办法,但是,我不是这方面的专家


如果我错了,请纠正我-

你想怎么写这个号码?例如,您希望将int写入始终为四个字节,还是作为文本,或者…?正如@Thomas所说,这取决于您希望使用的编码。例如,您可以执行writeUTFv.toString。请记住,无论您如何编写,您可能需要一种方法来确定所编写的类型。数据输出流仅适用于原语和字符串,因此,如果您想保持在对象级别,您仍然需要一个对象流。感谢大家提供的好建议。我在上面没有澄清的问题的第一个版本中留下了一个重要的要求。不幸的是,对象序列化将不起作用。@Barry如果我错了,请纠正我,但我认为这至少是非常棘手的,不可能的,因为在java/c中浮点数的表示方式不同?您想如何编写数字?例如,您希望将int写入始终为四个字节,还是作为文本,或者…?正如@Thomas所说,这取决于您希望使用的编码。例如,您可以执行writeUTFv.toString。请记住,无论您如何编写,您可能需要一种方法来确定所编写的类型。数据输出流仅适用于原语和字符串,因此,如果您想保持在对象级别,您仍然需要一个对象流。感谢大家提供的好建议。我在上面没有澄清的问题的第一个版本中留下了一个重要的要求。不幸的是,对象序列化将不起作用。@Barry纠正我的错误,但我认为这至少是非常棘手的,不可能的,因为在java/c中浮点数的表示方式不同?但在不知道对象是什么类型的情况下,如何反序列化呢?不幸的是,我在上面澄清的问题的第一个版本中留下了一个重要的限制。对象序列化将不起作用,因为这个字节[]必须可以转移到其他语言,例如C。在这种情况下,您应该真正考虑数字的含义,以及为什么希望它们具有任意格式。你期望什么样的数字?只有整数?浮点运算?合理的复杂的当与其他语言交互时,您必须更加具体。但是在不知道对象是什么类型的情况下,如何进行反序列化?不幸的是,我在上面澄清的问题的第一个版本中留下了一个重要的限制。对象序列化将不起作用,因为这个字节[]必须可以转移到其他语言,例如C。在这种情况下,您应该认真考虑您的意思
通过数字以及为什么您希望它们具有任意格式。你期望什么样的数字?只有整数?浮点运算?合理的复杂的当与其他语言交互时,您必须更加具体。我们正在传输每个值的字节、endian和格式,例如IEEE 754和字节[],因此我们在C端处理所有转换。我只想能够解析原语值,而不是在C中实现Java对象反序列化-@Barry如果我理解正确的话,你需要知道的就是如何将int/float转换成字节?或者只是因为你不喜欢我所知无法避免的瞬间?只是想知道是否有办法避免舞蹈的瞬间。一系列if/else测试实例。这太糟糕了,数字没有实现toByteArray方法。我们正在传输每个值的字节数、endian和格式,例如IEEE 754中的字节[],因此我们在C端处理所有转换。我只想能够解析原语值,而不是在C中实现Java对象反序列化-@Barry如果我理解正确的话,你需要知道的就是如何将int/float转换成字节?或者只是因为你不喜欢我所知无法避免的瞬间?只是想知道是否有办法避免舞蹈的瞬间。一系列if/else测试实例。这太糟糕了,数字没有实现toByteArray方法。这相当于public void writeDataOutputStream流,对象对象泛型无效这相当于public void writeDataOutputStream流,对象对象泛型无效