我有一个通过套接字连接到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
这很难维持。是不是有更简单的方法用数据填充我的对象?
答案 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)
方法创建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());
答案 1 :(得分:3)
为了解决这个问题,您需要为在Java中序列化的对象编写C ++解析器。这不是一项小任务。
相反,我建议您找到一些易于在Java和C ++程序之间解析和共享的序列化格式。优选地,存在用于序列化/反序列化的Java以及C ++库的格式。 JSON或Google Protocol Buffers是明显的候选人。