将数据序列化为连续数组

时间:2012-11-06 00:35:29

标签: c serialization

我有对象,我喜欢能够序列化为连续的字节流。两个问题:

1)char数组是否适合此任务?如果不是更好的选择?

2)这样做效率最高的是什么?到目前为止,我所做的是使用memcpy。例如,是否可以将double转换为chars的8个字节,反之亦然,而无需通过memcpy

我很清楚外部库,但我喜欢学习新东西。

2 个答案:

答案 0 :(得分:1)

序列化意味着您正在获取一个对象并给它一个represntation,可以用它来仅使用该表示来完全重建它。通常,序列化适用于文件存储,但它通常用于通过网络传递对象。

因此,通常,使用char或unsigned char工作正常。问题的真正原因是确保您存储对象包含的所有内容。这包括您尝试序列化的对象中引用的对象。

我首先使用谷歌搜索“深拷贝”。 deep copy vs shallow copy

编辑:memcpy是一种“浅拷贝”。

答案 1 :(得分:1)

  1. 是的,char是完成任务的绝佳选择。

  2. 如果您将结果存储到文件中并在同一架构上再次读取,则memcpy很好。但是如果你想通过套接字传递它或在其他地方打开它,你必须要更加小心。对于浮点和整数类型,表示和结尾始终是一个问题。

  3. 不要在float / integer上做一个简单的memcpy(并且避免从缓冲区中更多地抛出它(严格别名和UB))。

    对于浮点,查找这两个函数frexp()和ldexp()。网上有很多这样的内容,所以没有必要在这里复制它。

    对于积分,你可以这样做:

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

    这可以保证获得相同的号码。