2017-04-21 59 views
0

是否可以在不解析數據的情況下直接將字節陣列(通過tcp套接字接收)分配給Java對象?將字節數組分配給Java對象

在c有可能直接分配字節到一個結構,這是可能的Java?

+1

否;你需要一個序列化系統。 – SLaks

+0

'assign',你的意思是'讀入字節數組字段'? –

回答

2

不可能爲java中的對象分配一個字節數組並自動填充所有成員變量,但可以使用序列化從字節數組中獲取java對象。

您可以使用ObjectInputStreamObjectOutputStream來獲取流入和流出對象。從一個字節數組中取出一個在ObjectInputStream中包裝一個ByteArrayInputStream。該對象必須實現Serializable接口。這應該有助於避免手動解析字節數組。

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes)); 
MyObject o = (MyObject) in.readObject(); 

如果您正在讀取的數據不是序列化的java對象,您可以將方法添加到對象以幫助序列化。

從的javadoc在序列和反序列化過程中需要特殊處理應實現以下方法ObjectInputStream

序列化類:

private void writeObject(java.io.ObjectOutputStream stream) throws IOException; 
private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; 
private void readObjectNoData() throws ObjectStreamException; 

所以,你可以在數據讀取使用手動stream.read(...)在自定義的readObject方法中,並使用它在對象上設置成員變量。

+0

這在內部做了相當數量的解析 - 它不會簡單地將這些字節的不安全的memcpy寫入對象所在的內存中,就像OP似乎需要的那樣。 – yshavit

+0

我不確定表現。您還需要確保進入的數據是序列化的java對象。否則,您可以嘗試覆蓋readObject方法。我會爲你更新答案。 –

+1

我的觀點是,OP似乎想要C的功能,「我有這個結構,我知道它佔用了內存中的這213個字節,我有這個213字節的數組 - 我只是將一個指針指向該數組的開始,au voila,我有一個我的結構實例。「 Java沒有這種功能,除了可能通過不安全的類 - tbh我從來沒有搞錯過它們。但是,序列化絕對不是。這當然可能是因爲我誤解了OP的需求,而且他們只是尋找簡單的序列化而無需編寫大量的代碼。 – yshavit