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