2

我有一个 java 程序,它将(通过 TCP)数据包发送到 c++ 程序。只会发送两种类型的对象(结构 A 或结构 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 是一个静态的全局整数。

请注意,我不需要通用解决方案,因为我将严格处理上述类型。另外,我无法访问 c++ 程序(它是一个黑盒),两者都以小印度语操作。

4

2 回答 2

5

听起来 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))并将字节发送到服务器。

于 2012-11-27T02:50:54.157 回答
1

Java 使用的序列化算法就 Java 语言而言是标准的;您不能从 C/C++ 程序中反序列化此类对象,除非您为此目的使用外部 C/C++ 库。

反之亦然:您不能将 C/C++ 序列化的对象反序列化为 Java,除非您使用某种外部包。

那么,最好的选择是提出自己的协议并根据它进行序列化。您必须为您的协议编写 Java 和 C/C++ 实现。

于 2012-11-27T02:25:07.330 回答