簡體   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