C++ 数据序列化和 ABI 兼容性

问题描述 投票:0回答:1

我正在为嵌入式平台编写代码。我有一个通过 IPC 与服务进程通信的客户端库。

我正在用 C++ 开发这个客户端库和服务流程。当我刚接触 C++ 世界时,我正在阅读有关 ABI 的内容。

当我通过 IPC 发送数据时,我已经将其序列化为 uint8_t 字节数组。

但我想将这些数据保留在本地存储中,并在 IPC 失败时重新驱动。我可以将字节缓冲区写入 SQLite,但我不太明白这个决定的利弊。不是关于 SQLite 的使用或接收失败,而是具体要保留什么格式。

如果二进制接口发生变化,即使客户端和接收者进程中的序列化和反序列化例程相同,存储格式是否会出现问题?换句话说,从 ABI 角度来看,在同一应用程序中本地保留并重新读取为字节有效负载是否安全,或者我应该序列化为更常见的格式(例如 JSON)?如果编译器发生更改,是否存在数据库中现有数据的反序列化失败的风险?

c++ ipc abi
1个回答
0
投票

保存二进制数据没有问题,只要格式保持稳定,跨不同平台,

  1. 使用固定大小类型,如
    int64_t
    而不是
    long
    ,因为
    long
    不可移植。
  2. 使用编译器编译指示删除填充,因为填充不可移植。
  3. 字节顺序、大端序与小端序可能会成为可移植性问题,请改用网络字节序。

如果你正确地掌握了这三件事,你就可以保存二进制数据,并且它在存储、传输和处理方面比 JSON 之类的数据更有效。

确保在使用版本保存到磁盘时标记结构,即:

V1
,以便将来可以修改格式而不破坏向后兼容性。

© www.soinside.com 2019 - 2024. All rights reserved.