繁体   English   中英

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

[英]Cannot read in Java data serialized in C++

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

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个选项:

使用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)方法创建ByteBuffer ByteBuffer类也支持读取原始类型,就像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());

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM