C 将数据序列化到连续数组中
我希望能够将对象序列化为连续的字节流。两个问题: 1)C 将数据序列化到连续数组中,c,serialization,C,Serialization,我希望能够将对象序列化为连续的字节流。两个问题: 1) char数组是否适合此任务?如果不是,还有什么更好的选择 2) 这样做最有效的方法是什么?到目前为止,我所做的是使用memcpy。例如,是否可以在不经过memcpy的情况下,将double转换成8字节的字符,反之亦然 我很清楚这方面的外部库,但我喜欢学习新的东西。序列化意味着您正在获取一个对象并给它一个表示,该表示可以用于仅使用该表示完全重建它。通常,序列化适用于文件存储,但它通常用于通过网络与对象通信 所以,通常,使用char或unsig
char
数组是否适合此任务?如果不是,还有什么更好的选择
2) 这样做最有效的方法是什么?到目前为止,我所做的是使用memcpy
。例如,是否可以在不经过memcpy
的情况下,将double
转换成8字节的字符,反之亦然
我很清楚这方面的外部库,但我喜欢学习新的东西。序列化意味着您正在获取一个对象并给它一个表示,该表示可以用于仅使用该表示完全重建它。通常,序列化适用于文件存储,但它通常用于通过网络与对象通信
所以,通常,使用char或unsigned char就可以了。问题的真正症结在于确保存储对象包含的所有内容。它包括您尝试序列化的对象中引用的对象
我会从谷歌搜索“深度复制”开始
编辑:memcpy是“浅拷贝”的一种形式
是的,char是执行此任务的最佳选择
如果您将结果存储到一个文件中,并在相同的体系结构上再次读取它,memcpy就可以了。但是如果你想把它通过插座或者在其他地方打开,你必须更加小心。对于浮点和整数类型,表示和endianess始终是一个问题
不要对浮点/整数执行简单的memcpy(并避免从缓冲区对其进行更多的强制转换(严格的别名和UB))
对于浮点,查找这两个函数frexp()和ldexp()。网络上有很多这样的内容,所以这里没有复制的必要
对于积分,可以执行如下操作:
buffer[0] = integer >> 24;
buffer[1] = integer >> 16;
buffer[2] = integer >> 8;
buffer[3] = integer;
这保证了返回相同的数字。如果序列化对您来说是什么目标?这可能是最好的实现方式。使用MPI的文件I/O和发送/接收为什么不使用htonl
和friends?@jbowes这也是一个不错的选择。我想我个人更喜欢移动和分配。