我目前正在寻找一个好的OO设计来序列化C++/Qt应用程序。想象应用程序的类基于树结构组织,使用复合模式实现,如下图所示。我想到的两个可能的原则:1.)将save()/load()函数放在每个必须可序列化的类中。如果多次看到这个,通常是用boost实现的。在类里面的某个地方,你会发现这样的东西:friendclassboost::serialization::access;templatevoidserialize(Archive&ar,constunsignedintversion){ar&m_meber1;}您也可以将它分成save()和load()。但这种方法的缺点是:如果您想在
具体来说,我指的是Boost.Serialization教程中的演示here.在上面的demo中,bus_top实例作为指针存储在bus_route中,展示了指针的序列化是如何实现的。然而,我观察到一个有趣的行为,即析构函数bus_stop::~bus_stop()永远不会为restore_schedule()bus_stop对象调用。我在bus_stop::~bus_stop()中放置了一个断点,它仅由main函数末尾的delete语句触发。在加载序列化数据期间,初始化指针的对象在boost/archive/detail/iserializer.hpp中定义的pointer_iser
编辑:问题标题是基于对我得到的编译器错误的深刻误解。我(愚蠢地)假设错误是,我试图反序列化到我在函数内部声明的对象。这是完全错误的。我自己没有做足够的调试工作,否则我本可以找出问题所在。所以标题很误导,我改了。感谢АндрейБеньковский的帮助。我正在使用cereal在我的引擎中为3D模型编写序列化函数,事实证明它非常高效且易于使用。到目前为止,当我测试(反)序列化一个简单的网格时,一切都很好。但现在我正在尝试反序列化另一个类,但遇到了一个我没有得到的问题。voidloadFile(std::stringfilepath){DescriptionFilefile;{ifstr
boost::serialization能够序列化它们最派生类的多态对象,即使这些对象由指向基类的引用/指针指向。这不需要虚函数。要做到这一点,boost::serialization需要知道存在的多态类型:Archive::register_type必须在Archive用于序列化的对象。Thisexample展示了如何注册类型以及如何序列化它们。我想知道这是如何实现的。我试图查看boost::serialization源代码但失败了:我不太擅长模板元编程。 最佳答案 boost.serialization可以使用typeid()或
很长一段时间以来,我一直在努力使这项工作成功。在我的项目中,有6个类正在使用boost中的确切教程通过实现模板函数序列化进行序列化。这些类是:State、guState、Policy、Action、Param、Vec3D。当我序列化并保存它们时,它工作正常。我确实得到了一个文本文件,里面有各种数字和字符串。没有提示,没有警告,没有抛出异常。唯一的情况是,如果我尝试序列化一个类的指针成员,空洞进程就会变成僵尸。所以我不尝试这样做,保存工作。当我尝试加载时,我得到:terminatecalledafterthrowinganinstanceof'boost::archive::archiv
如问题标题所示-我需要序列化指向每个其他数据结构的复杂网络,并由可能没有默认构造函数的类表示。这些类通常有一个vectorofpointers或vectorofpairs。我认为简单地分配sizeof(SomeClass)的内存,然后用序列化例程填充它是有意义的,但这不知何故会导致与字符串相关的未初始化内存问题(resize()失败,可能未初始化的字符串对象是不愿意工作)。示例代码如下所示:friendclassboost::serialization::access;templatevoidsave(Archive&ar,constunsignedintversion)const{i
我有一些二进制数据,它是通过序列化一个谷歌ProtocolBuffer类获得的。我如何在运行时找出为其序列化数据的类。例如,假设我有一个类abc。我把这个类abc序列化成二进制数据。有没有什么方法可以验证这个二进制数据是通过序列化classabc,而不是其他一些类获得的?另外,如果我用xyz类的parse方法解析这个abc类的二进制数据,我怎么知道解析是否成功。 最佳答案 protobuf不包含在线路上的任何类型信息(除非您自己在protobuf外部这样做)。因此,您不能严格验证-这实际上是一件好的事情,因为这意味着类型是可互换和兼
我尝试构建我在这里找到的第一个示例:Boostserializationtutorial但我得到这个错误:Undefinedsymbols:"boost::archive::archive_exception::~archive_exception()",referencedfrom:voidboost::serialization::throw_exception(boost::archive::archive_exceptionconst&)inmain.ovoidboost::archive::basic_text_iprimitive>>::load(int&)inmain.o
这是我类(class)的样子:#include#include#include#include//includeheadersthatimplementaarchiveinsimpletextformat#include#include#includeusingnamespacestd;usingnamespaceboost;classouter{friendclassboost::serialization::access;public:inta;classinner{friendclassboost::serialization::access;public:inta;inner(
我正在创建一个客户端服务器应用程序,现在我正在处理一种最简单的方法来序列化一些类,交付给另一端,然后放回我以后可以使用的类。我意识到这并不简单,有些人可能会说用C或C++等低级语言是不可能的,但实际上可以通过大量编码实现。我想知道是否其他人已经没有为此创建一个解决方案,它是可移植的并且可以工作,所以我不需要重新发明轮子。目前我的解决方案(可能有点太复杂):每个要序列化和反序列化的类都继承自抽象类Serializable,它包含两个函数:QHashToHash();voidLoadHash(QHashhash);第一个函数创建一个包含所有公共(public)和私有(private)变量的