【发布时间】:2020-11-10 23:53:59
【问题描述】:
我目前正在尝试使用 BOOST 库将数据作为二进制存档序列化到共享内存段中。 我使用 text_oarchive() 方法成功实现了该功能,如下所示。现在我想使用 binary_oarchive() 方法而不是 text_oarchive() 方法。
shared_memory_object::remove("shm");
shared_memory_object shm(create_only, "shm", read_write);
shm.truncate(sizeof(UnSerData)); // 10MiB
mapped_region region(shm, read_write);
bufferstream bs(std::ios::out);
bs.buffer(reinterpret_cast<char*>(region.get_address()), region.get_size());
boost::archive::text_oarchive oa(bs);
oa << UnSerData;
在实现 binary_oarchive() 方法时,它失败了: 错误:重载“binary_oarchive(boost::interprocess::bufferstream&)”的调用不明确 boost::archive::binary_oarchive oa(bs);
shared_memory_object::remove("shm");
shared_memory_object shm(create_only, "shm", read_write);
shm.truncate(sizeof(UnSerData)); // 10MiB
mapped_region region(shm, read_write);
bufferstream bs(std::ios::out);
bs.buffer(reinterpret_cast<char*>(region.get_address()), region.get_size());
boost::archive::binary_oarchive oa(bs);
oa << UnSerData;
我只是不确定应该为 binary_oarchive() 方法使用哪种缓冲区 我已经尝试过 ostream 但无法让它工作。 已经谢谢了。
编辑: JSON 数据如下所示:
{
"name": "UMGR",
"description": "UpdateManager",
"dlt_id": "1234",
"log_mode": ["kConsole"],
"log_level": "kVerbose",
"log_dir_path": "",
"ipc_port": 33,
"reconnection_retry_offset": 0,
"msg_buf_size": 1000
}
这是一个非常简单的数据示例,并且会变得更加复杂。 我使用 RapidJSON 将数据解析为来自 RapidJSON 的文档对象。然后数据被解析成如下所示的结构:
typedef struct{
string name;
string description;
string dlt_id;
string log_mode;
string log_level;
string log_dir_path;
uint ipc_port;
uint reconnection_retry_offset;
uint msg_buf_size;
int checksum;
//function for serializing the struct
template <typename Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & name;
ar & description;
ar & dlt_id;
ar & log_mode;
ar & log_level;
ar & log_dir_path;
ar & ipc_port;
ar & reconnection_retry_offset;
ar & msg_buf_size;
ar & checksum;
}
} UMGR_s;
这可能不是解析 JSON 数据最“有效”的方式,但降低解释器速度本身不是我的目标,而是优化整个系统。 由于我正在将此方法与我也使用此 JSON 解析器实现的当前尝试进行比较,因此结果应该仍然有意义。
我还考虑过使用内存映射而不是共享内存实现。因为守护程序无论如何都必须打开文件(带有序列化数据)并将其传递给进程。所以也许让接收进程通过 boost 库中的内存映射实现来收集数据会更有效。
【问题讨论】:
标签: c++ serialization boost