我有一个java程序,它将(通过TCP)数据包发送到c ++程序。只发送两种类型的对象(struct A或struct B)。我需要序列化这两个对象并将它们发送到c ++程序,这样当在c ++程序中反序列化时,它们将是struct A或struct B类型,具体取决于已发送的内容。如何在没有任何外部Java包的情况下实现这一目标?
struct A
{
unsigned int field1;
unsigned int field2;
}
struct B
{
unsigned int length;
struct A list[GLOBALLENGTH];
}
GLOBALLENGTH是一个静态的globel int。
请注意,我不需要一般解决方案,因为我将严格处理上述类型。此外,我没有访问c ++程序(它是一个黑盒子),都在小印度。
答案 0 :(得分:4)
听起来c ++程序期望每个结构中的数据的原始转储,没有填充,以小端顺序,使用32位整数的声明顺序的字段。如果一切正确,这是写c ++程序消耗字节的一种方法:
private static final int A_SIZE = 8;
private static final int B_SIZE = 4 + GLOBALLENGTH * 8;
public byte[] writeA(A a) {
byte[] bytes = new byte[A_SIZE];
writeA(a, bytes, 0);
return bytes;
}
private void writeA(A a, byte[] bytes, int offset) {
ByteBuffer buff = ByteBuffer.wrap(bytes, offset, A_SIZE);
buff.order(ByteOrder.LITTLE_ENDIAN);
buff.putInt(a.field1).putInt(a.field2);
}
public byte[] writeB(B b) {
byte[] bytes = new byte[B_SIZE];
ByteBuffer buff = ByteBuffer.wrap(bytes, 0, 4);
buff.order(ByteOrder.LITTLE_ENDIAN);
buff.putInt(b.length);
int offset = 4;
for (A a : b.list) {
writeA(a, bytes, offset);
offset += A_SIZE;
}
return bytes;
}
然后,您可以调用相应的公共方法(writeA(A)
或writeB(B)
)并将字节发送到服务器。
答案 1 :(得分:1)
就Java语言而言,Java使用的序列化算法是标准的;除非为此目的使用外部C / C ++库,否则不能在C / C ++程序中反序列化此类对象。
反之亦然:除非使用某种外部包,否则不能将C / C ++ - 序列化对象反序列化为Java。
然后,最好的办法是提出自己的协议并根据它进行序列化。您必须为协议编写Java和C / C ++实现。