我有我喜歡能夠序列化爲連續字節流的對象。兩個問題:將數據序列化爲連續數組
1)char
是否適合此任務?如果不是什麼更好的選擇?
2)這樣做的效率最高?到目前爲止,我所做的是使用memcpy
。舉例來說,是否有可能將double
轉換成8字節的chars
,反之亦然,無需通過memcpy
?
我很瞭解這個外部庫,但我喜歡學習新東西。
我有我喜歡能夠序列化爲連續字節流的對象。兩個問題:將數據序列化爲連續數組
1)char
是否適合此任務?如果不是什麼更好的選擇?
2)這樣做的效率最高?到目前爲止,我所做的是使用memcpy
。舉例來說,是否有可能將double
轉換成8字節的chars
,反之亦然,無需通過memcpy
?
我很瞭解這個外部庫,但我喜歡學習新東西。
是的,字符是一個偉大的選擇任務。
如果您將結果存儲到文件中並在同一架構上再次讀取,則memcpy很好。但是如果你想通過套接字或者在其他地方打開它,你必須更加小心。浮點和整型類型,表示和永久性總是一個問題。
不要對float/integer做一個簡單的memcpy(並且避免更多的從緩衝區(嚴格別名和UB)轉換它)。
對於浮點,查找這兩個函數frexp()和ldexp()。網絡上有很多這樣的內容,因此沒有必要在這裏複製它。
對於積分,你可以做這樣的事情:
buffer[0] = integer >> 24;
buffer[1] = integer >> 16;
buffer[2] = integer >> 8;
buffer[3] = integer;
這可以保證得到相同的回數。
序列化意味着你正在接受一個對象並給它一個represntation,它可以被用來僅使用該表示來完全重建它。通常,序列化適用於文件存儲,但通常用於通過網絡傳輸對象。
所以,通常,使用char或unsigned char工作得很好。問題的真正目的是確保您存儲對象所包含的所有內容。這包括您嘗試序列化的對象中引用的對象。
我會以google搜索「深層複製」開始。 deep copy vs shallow copy
編輯:memcpy是「淺拷貝」的一種形式。
如果您序列化的目標是什麼?這可能會推動最佳實施。 – creechy
好吧文件I/O和發送/接收使用MPI – GradGuy