[英]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.