gpt4 book ai didi

C++ Boost 如何将 C++ 对象序列化到共享内存并在另一个应用程序中重新创建它

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:46 27 4
gpt4 key购买 nike

我将使用 boost 共享内存,我想将我的 C++ 对象复制到该内存中。假设我有一个 C++ 类

class myobj
{
public:
std::string name1;
int name1Length;
std::string name2;
int name2Length
};

我创建了这个类的一个对象myobj 对象;

假设我将 name1 作为“Name1”,长度为 5,将 name2 作为“Name2”,长度为 5。

我有一个使用 boost 库创建的共享内存

            shared_memory_object shm(open_only, "SharedMemory", read_write);

//Map the whole shared memory in this process
mapped_region region(shm, read_write);

我想将我的 C++ 对象 obj 复制到这个内存中,以便我可以在另一个应用程序中重新创建相同的对象。

最佳答案

这似乎是一种迂回的方式(为什么不使用文件?)。

这是一个使用 Boost Interprocess bufferstream 的演示:

#include <boost/serialization/string.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/streams/bufferstream.hpp>

class myobj
{
public:
std::string name1;
int name1Length;
std::string name2;
int name2Length;

private:
friend class boost::serialization::access;
template <typename Ar> void serialize(Ar& ar, unsigned) { ar & name1 & name1Length & name2 & name2Length; }
};

namespace bip = boost::interprocess;

void do_save() {
bip::shared_memory_object shm(bip::create_only, "SharedMemory", bip::read_write);

shm.truncate(10u<<20); // 10MiB
bip::mapped_region region(shm, bip::read_write);

bip::bufferstream bs(std::ios::out);
bs.buffer(reinterpret_cast<char*>(region.get_address()), region.get_size());
boost::archive::text_oarchive oa(bs);

{
myobj obj;
obj.name1 = "name the first";
obj.name2 = "name the second";
obj.name1Length = obj.name1.length(); // why?
obj.name2Length = obj.name2.length(); // why?

oa << obj;
}
}

myobj do_load() {
bip::shared_memory_object shm(bip::open_only, "SharedMemory", bip::read_only);
bip::mapped_region region(shm, bip::read_only);

bip::bufferstream bs(std::ios::in);
bs.buffer(reinterpret_cast<char*>(region.get_address()), region.get_size());
boost::archive::text_iarchive ia(bs);

{
myobj obj;
ia >> obj;

return obj;
}
}

#include <iostream>
int main() {
do_save();
auto obj = do_load();
std::cout << "obj.name2: " << obj.name2 << "\n";
}

关于C++ Boost 如何将 C++ 对象序列化到共享内存并在另一个应用程序中重新创建它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48745383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com