在Java中序列化然后在C ++中反序列化?

时间:2012-11-27 02:20:38

标签: java c++

我有一个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 ++程序(它是一个黑盒子),都在小印度。

2 个答案:

答案 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 ++实现。