gpt4 book ai didi

C++ Boost::serialization:如何在一个程序中归档一个对象并在另一个程序中恢复它?

转载 作者:太空宇宙 更新时间:2023-11-04 13:42:51 25 4
gpt4 key购买 nike

我正在使用 Boost Serialization 来保存和加载我的游戏的整体状态以及在外部存储 map 和生物数据。

我有两个程序。第一个运行游戏本身,根据保存在外部文件中的数据根据​​需要创建新对象。它还会生成自己状态的保存文件。到目前为止,这些都有效。

第二,我作为一名专注的编辑进行创作。我想用它来创建和操作游戏程序使用的上述文件。

所以我在第二个程序中制作了所有需要外部文件的类的镜像,但为了编辑目的而具有不同的功能。中的所有数据

void serialize(AreaArchive & aar, const unsigned int version)
{...}

这两个程序的部分类是相同的。

我用它来创建文件:

areaGen.push_back(new Area("area1"));

std::string fileName;

for(std::vector<Area*>::iterator it = areaGen.begin(); it != areaGen.end(); ++it)
{
fileName = (*it)->name + ".areabase";
std::ofstream areafile(fileName);

boost::archive::text_oarchive outArchive(areafile);
outArchive << *it;
}

文件,比方说“area1.areabase”是完美生成的 AFAIK。我将它移动到我的第一个程序的目录,执行函数

bool LoadAreaState(std::string areaName, Area *target, bool baseState)
{
std::cout << "Debug: entered area loading function..." << std::endl;

std::string fileName;
if(baseState)
fileName = areaName + ".areabase";
else
fileName = areaName + ".areafile";

std::ifstream areafile(fileName);

...

std::cout << "Debug: file opened sucessfully..." << std::endl;

boost::archive::text_iarchive inArchive(areafile);

std::cout << "Debug: inarchive to target..." << std::endl;

inArchive >> *target; // The step at which it fails - Terminate by boost::serialization's exception

std::cout << "Debug: target Area object restored..." << std::endl;

return true;
}

当然它不起作用。第一个程序和第二个程序中类的成员对象无论如何都不可能相同。可以吗?但是序列化 block 包含完全相同类型的数据。

我希望这个例子表达了我想要做的事情。但是有什么方法可以让它发挥作用吗?

非常感谢。

最佳答案

一般来说,Boost Serialization 不支持这种行为。

对于严格琐碎的(POD,当然不是虚拟类型)你将能够摆脱困境。例如。我过去曾连载过一个 map<K,V>并将其反序列化为 flat_map<K,V> ), 对于琐碎的 KV .但是,这些都不是库的预期用途,您应该考虑未指定的行为。因此,除非您已经为自己验证了所有代码路径以确保您正在做的事情能够正常工作,否则不要对 Boost Serialization 变得聪明。

现在,这是一个应该工作的小例子:

 struct A { 
int x;
virtual void display() const; {}
};

struct B {
int x
virtual void display() const; {}
};

类型将不相关,RTTI 将从 Boost 序列化中检查。

如何解决这个问题?

你可以

  • 将可序列化类型移动到共享(静态)库中,并使用来自两个程序的完全相同的代码。问题消失了,因为类型信息是共享的
  • 使用自定义二进制序列化
  • 改用共享内存/内存映射文件(尽管这不是微不足道的,所以只有当您有信心可以做到上述情况时才这样做)

重要 Boost 序列化二进制存档不是,事实上,非常便携!你应该看看 [EOS Portable Archives](一般来说,Boost Serialization 不支持这种行为。

对于严格琐碎的(POD,当然不是虚拟类型)你将能够摆脱困境。例如。我过去曾连载过一个 map<K,V>并将其反序列化为 flat_map<K,V> ).但是,这些都不是库的预期用途,您应该考虑未指定的行为。因此,除非您已经为自己验证了所有代码路径以确保您正在做的事情能够正常工作,否则不要对 Boost Serialization 变得聪明。

现在,这是一个应该工作的小例子:

 struct A { 
int x;
virtual void display() const; {}
};

struct B {
int x
virtual void display() const; {}
};

类型将不相关,RTTI 将从 Boost 序列化中检查。

如何解决这个问题?

你可以

  • 将可序列化类型移动到共享(静态)库中,并使用来自两个程序的完全相同的代码。问题消失了,因为类型信息是共享的
  • 使用自定义二进制序列化
  • 改用共享内存/内存映射文件(尽管这不是微不足道的,所以只有当您有信心可以做到上述情况时才这样做)

重要 Boost 序列化二进制存档不是,事实上,非常便携!你应该看看EOS Portable Archives如果你想在不同机器之间共享文件等等。) 如果你想在不同的机器之间共享文件等等。

关于C++ Boost::serialization:如何在一个程序中归档一个对象并在另一个程序中恢复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27073936/

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