2012-11-06 21 views
2

我有我喜歡能夠序列化爲連續字節流的對象。兩個問題:將數據序列化爲連續數組

1)char是否適合此任務?如果不是什麼更好的選擇?

2)這樣做的效率最高?到目前爲止,我所做的是使用memcpy。舉例來說,是否有可能將double轉換成8字節的chars,反之亦然,無需通過memcpy

我很瞭解這個外部庫,但我喜歡學習新東西。

+0

如果您序列化的目標是什麼?這可能會推動最佳實施。 – creechy

+0

好吧文件I/O和發送/接收使用MPI – GradGuy

回答

1
  1. 是的,字符是一個偉大的選擇任務。

  2. 如果您將結果存儲到文件中並在同一架構上再次讀取,則memcpy很好。但是如果你想通過套接字或者在其他地方打開它,你必須更加小心。浮點和整型類型,表示和永久性總是一個問題。

不要對float/integer做一個簡單的memcpy(並且避免更多的從緩衝區(嚴格別名和UB)轉換它)。

對於浮點,查找這兩個函數frexp()和ldexp()。網絡上有很多這樣的內容,因此沒有必要在這裏複製它。

對於積分,你可以做這樣的事情:

buffer[0] = integer >> 24; 
buffer[1] = integer >> 16; 
buffer[2] = integer >> 8; 
buffer[3] = integer; 

這可以保證得到相同的回數。

+1

爲什麼不使用'htonl'和朋友? – jbowes

+0

@jbowes也是一個不錯的選擇。我想我個人更喜歡轉移和分配。 – imreal

1

序列化意味着你正在接受一個對象並給它一個represntation,它可以被用來僅使用該表示來完全重建它。通常,序列化適用於文件存儲,但通常用於通過網絡傳輸對象。

所以,通常,使用char或unsigned char工作得很好。問題的真正目的是確保您存儲對象所包含的所有內容。這包括您嘗試序列化的對象中引用的對象。

我會以google搜索「深層複製」開始。 deep copy vs shallow copy

編輯:memcpy是「淺拷貝」的一種形式。