C 将数据序列化到连续数组中

C 将数据序列化到连续数组中,c,serialization,C,Serialization,我希望能够将对象序列化为连续的字节流。两个问题: 1) char数组是否适合此任务?如果不是,还有什么更好的选择 2) 这样做最有效的方法是什么?到目前为止,我所做的是使用memcpy。例如,是否可以在不经过memcpy的情况下,将double转换成8字节的字符,反之亦然 我很清楚这方面的外部库,但我喜欢学习新的东西。序列化意味着您正在获取一个对象并给它一个表示,该表示可以用于仅使用该表示完全重建它。通常,序列化适用于文件存储,但它通常用于通过网络与对象通信 所以,通常,使用char或unsig

我希望能够将对象序列化为连续的字节流。两个问题:

1)
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这也是一个不错的选择。我想我个人更喜欢移动和分配。