无法读取用C ++序列化的Java数据

时间:2015-02-11 14:21:21

标签: java c++ sockets serialization

我有一个通过套接字连接到C ++服务器的Java客户端。

C ++服务器向客户端发送序列化对象。

然而,序列化对Java和C ++的工作方式不同,所以我无法以这种方式读取对象:

objectInputStream.readObject();

这迫使我手动读取对象的每个单独值:

byte[] buffer = read(FOUR_BYTES);
int flag = convertBufferToInt(buffer);

byte[] buffer = read(FOUR_BYTES);
float price = convertBufferToFloat(buffer);

// More stuff

myObject.setFlag(flag);
myObject.setPrice(price);

// More stuff

这很难维持。是不是有更简单的方法用数据填充我的对象?

2 个答案:

答案 0 :(得分:3)

是的,有(是)。只有标准库有2个选项:

使用DataInputStream

查看DataInputStream课程。它有方法来读取原始类型的值,如readByte()readInt()readLong()readFloat()readChar()readUTF()(用于读取UTF- 8编码String)等。

所以你的代码变得如此简单:

// Obtain InputStream from Socket:
InputStream is = ...;
// Create DataInputStream:
DataInputStream dis = new DataInputStream(is);

myObject.setFlag(dis.readInt());
myObject.setPrice(dis.readFloat());

使用ByteBuffer

为此,您必须首先将整个数据读入字节数组。完成后,您可以使用ByteBuffer.wrap(byte[] array)方法创建ByteBufferByteBuffer类也支持读取原始类型,就像DataInputStream类一样。

ByteBuffer支持更改字节顺序的好处(读取多字节值如int的低字节和高字节的顺序/书面):ByteBuffer.order(ByteOrder bo)。如果您与使用不同字节顺序的系统进行通信(在您的情况下可能适用),这非常有用。

使用ByteBuffer的示例:

// Read all your input data:
byte[] data = ...;
// Create ByteBuffer:
ByteBuffer bb = ByteBuffer.wrap(data);

myObject.setFlag(bb.getInt());
myObject.setPrice(bb.getFloat());

答案 1 :(得分:3)

为了解决这个问题,您需要为在Java中序列化的对象编写C ++解析器。这不是一项小任务。

相反,我建议您找到一些易于在Java和C ++程序之间解析和共享的序列化格式。优选地,存在用于序列化/反序列化的Java以及C ++库的格式。 JSON或Google Protocol Buffers是明显的候选人。