问题标签 [boost-serialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2006 浏览

c++ - Boost::Serialization 和 MFC Doc/View 架构

我正在移植现有的 MFC C++ 应用程序以使用 Boost::Serialization 处理 XML 文件。我的 CDocument 对象包含应用程序的所有数据。我已将序列化功能实现为:

为了捕获保存和加载事件,在 CDoc *.cpp 文件中,我重载了基类函数 OnOpenDocument() 和 OnSaveDocument() 以实现 Boost::Serialization:

保存文档工作正常。问题是加载文档不起作用。boost 库似乎复制了 CMyDoc 对象,因为指针返回了不同的地址。这意味着加载的文件没有加载到当前文档中。CDoc 可以用 boost 覆盖自己吗?它可以与MFC CArchive。

我考虑过将行指示为“可能的解决方案”,但这意味着为 CMyDoc 类实现复制构造函数。这消除了 boost 的好处之一,因为我将为每个变量编写两行代码: 1. ar & BOOST_SERIALIZATION_NVP(m_Param1) // 用于保存和加载到 pDoc 2. this->m_Param1 = pDoc.m_Param1 // in CMyDoc 复制构造函数

如果我重载 CMyView 以捕获文件打开和保存事件,则 Doc/View 架构提供的 MRU 列表管理将不会发生。

我敢肯定这已经做了一百万次,但我在网上找不到任何信息。诡异的!非常感谢任何帮助:D


仔细阅读文档,我看到 Boost 承认任何序列化的指针都使用 new 关键字进行反序列化:“指针的序列化在库中实现,代码类似于以下内容:”

文档建议在必要时重载此函数:

但这将再次导致需要实现 CMyDoc 复制构造函数。啊啊啊!!


如果它对任何人有帮助,我收到了 Robert Ramey 的回复。基本上,我并没有遗漏一些明显的东西:CMyDoc serialize(Archive& ar, const unsigned int version) 函数不是运行器,所以我实现了单独的 boost_save 和 boost_load 函数。我不得不重载 OnOpenDocument 和 OnSaveDocument,例如:

BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName) { clear();

}

这是必要的,因为 MFC CArchive 拥有该文件,直到 MFC 序列化函数退出,不允许 boost::serialization 访问该文件。即使在 Serialize 函数中调用 ar.Abort() 也不起作用,因为 CDocument 基类假定 ar 在返回基类 Serialize 函数时存在。

0 投票
2 回答
208 浏览

c++ - boost::serialization 仅序列化地图的键

我有一个带地图的类,我想使用 boost 序列化来序列化该类。

仅通过知道 int 就可以推导出 ComplicatedThing。我想有效地序列化它。一种方法(ick,但有效)是制作一个键向量并序列化该向量。

但这是不雅的。使用 BOOST_SERIALIZATION_SPLIT_MEMBER() 和加载/保存方法,我想我应该能够完全跳过中间向量的分配。我被困住了。

也许我的答案在于理解 boost/serialization/collections_load_imp.hpp。希望有更简单的路径。

0 投票
1 回答
260 浏览

c++ - 存储流数据的最佳方式

我正在制作一个游戏消息系统并使用 boost::serialize 将消息数据转换为流并发送它。这适用于即时传输消息,因为我可以发送对流的引用。

但是,在某些情况下,我也想将消息排队。我不确定存储数据的最佳方式是什么。

我试过std::queue<std::stringstream>了,但这只是错误很多。

std::bitset 看起来很有希望,但我不确定。

或者这完全是疯子?

0 投票
4 回答
1913 浏览

boost - 提升文件的序列化结束

我使用 Boost 将多个对象序列化为二进制存档。从 a 中读回这些对象时binary_iarchive,有没有办法知道存档中有多少对象,或者只是一种检测存档结束的方法?

我发现的唯一方法是使用 try-catch 来检测流异常。提前致谢。

0 投票
2 回答
270 浏览

c++ - Boost序列化问题

我试图在我的类中获取两个数组以使用 boost 序列化库。我可以很好地保存数据,但由于某种原因,我无法将其加载回来。我认为它与 ia >> *this; 但我不知道如何解决它。任何人都可以指出我正确的轨道吗?

0 投票
1 回答
3545 浏览

c++ - boost:序列化重构(加载)

我正在使用 boost:serialization 将数据结构保存到文件中。实际数据是类和子类的指针向量。然而,被序列化的类的构造函数将另一个实例化类 Agent 作为参数,该类 Agent 是一个控制与模拟 API(webbots)通信的对象。我看到在 boost::serialization 示例中,可序列化的对象需要一个空的构造函数 class() {}; 用于重建。然而,这在我的情况下是不切实际的。如何使用重建但包含与 API 通信的对象?可序列化类之一具有以下构造函数:

我从 boost docs 中的示例中看到我需要这样的东西:

然而 Agent &A 必须作为参数传递。我应该找到解决这个问题的方法(使用外部、单例、全局对象)还是有办法在重建时修改这种行为?我确定我在这里遗漏了一些东西。

谢谢

编辑:也许我解释得不够清楚。尝试通过重建序列化数据来“加载”时收到错误消息。

这就是让我研究 boost::serialize 代码的原因,并认为它正在调用构造函数或复制运算符。如何使它使用特定的构造函数来序列化数据并将代理引用 &a 作为参数?

编辑#2:

States 是 boost::serialization::access 的朋友,并且有一个函数 serialize。保存工作正常,加载是问题。states 是:boost::ptr_vector<S> states;其中 S 是 State 多态类的一种类型。

状态是基类并且具有“序列化”

guState 继承自 State。

accel、gyro、gps 是具有 3 个双变量的简单结构。它们在上面被序列化^^。职位是一个std::map<std::string,float> positions;

查看序列化的文本文件,一切正常。我不明白为什么它在尝试加载文件时调用构造函数。

编辑#3:

基本构造函数是:

派生构造函数是:

每个状态(或派生状态)中保存的代理引用 &A 指的是从模拟 API 获得的对象。它控制一个机器人。我无法序列化它,序列化它没有意义。

当我使用:

我收到以下错误:

指的是构造函数中使用的引用。和:

如您所见,尝试保存对 Agent 的引用是没有意义的,因为每次启动应用程序时,该引用(即使可以保存或序列化)都可能不同。

并且在加载构造数据时,除了我可能使用了错误的语法之外,从对代理的序列化引用进行构造是没有意义的。

我相信我需要的是一种告诉 load_construct_data 如何获取对代理的引用(在初始化代理对象之后)并使用该引用来构造数据的方法。

这有任何意义吗 ?你认为这是可行的吗?

编辑#4

它不允许序列化 guState::caller

我还使类 Agent 可序列化,并重载了 Agent 的 load_construct_data 和 save_construct_data,以便从模拟应用程序请求新的 Agent 实例来控制 API。

0 投票
3 回答
1663 浏览

c++ - C++ 可移植数组序列化

在我从事的一个项目中,我必须通过网络来回发送浮点/双精度数组,我使用 Boost.Asio 来处理网络内容,因为我需要异步通信,而这似乎是那里最好的(唯一真实的?)...

发送的数组是浮点数/双精度数,双方都知道类型。AFAIK,浮点存储标准可能存在问题+与 longs/ints、endians 等相同的东西。

从逻辑上讲,发送的数组是密集矩阵,一端由 Eigen 处理,另一端使用 BLAS / [MKL|ATLAS] 和诸如此类的东西,很可能需要其他用途,所以我将采用最通用的方式可能&这似乎是在传递数组。

关键要求是高性能和可移植性,因为客户端和服务器都可以在 32 / 64 位的任意组合上运行,并且通信非常密集(实时监控,客户端每秒刷新一次),所以序列化开销本身必须是最小的。

从我目前发现的情况来看,这里要考虑的两个大玩家是 Boost.Serialization 和 Google 的 Protobuf。

BS 的最大优点是我已经在项目中大量使用了 Boost(尽管单元测试在 Google 测试中),而且使用make_array(). 它的最大缺点是性能。

从我的发现来看,protobuf 的优势在于性能,所有的测试似乎都表明它在任何操作上都比 BS 高出 10-20 倍。我在 protobuf 文档中没有找到的是在消息中添加一个数组。它使用重复的字段,据我了解,我必须MsgObject.repeatedProp.Add(const T&)在数组的每个元素上使用,这意味着,对于 10k 数组,它需要 10k 次调用,这似乎也有点昂贵。

任何关于如何解决这个问题的建议都将受到高度赞赏,因为我对 C++ 的经验是有限的,而且我最近才在长时间休息后重新开始编写它......

0 投票
3 回答
601 浏览

c++ - 如何使用 Boost 序列化序列化 Boost scoped_array?

我正在尝试scoped_array使用 Boost 序列化来序列化 Boost,但编译器(VS2008)给了我以下错误消息:

如何序列化一个scoped_array? 我应该为此包含一个 Boost 库吗?

0 投票
1 回答
328 浏览

c++ - 如何覆盖 boost::serialize 获取指向对象的指针时发生的情况

嘿,所以我理解 boost 会自动序列化指针,只要你已经为它指向的对象定义了序列化函数,但是

如果我想编写一个需要 a 的 boost 序列化函数,我该怎么办myClass pointer

我不希望 boost 执行保存指向的对象然后恢复指向该对象的指针的默认操作。我希望提升做一些不同的事情。

0 投票
2 回答
1266 浏览

c++ - boost::serialization: 重载 load_construct_data: 根本没有可访问的构造函数

所以我正在使用 boost::serialization 库,并且我试图覆盖一个类的构造方式,因为它没有默认构造函数。此处演示了这一点。对我来说,该函数似乎接受了class* t然后将其设置为指向一个新构造的对象。如果我错了,这绝对是我错误的根源。

但是,构造我的类的唯一方法是使用另一个类create()函数,这意味着我需要偏离示例中的代码(这在 boost::serialization 命名空间中说明):::new(t)my_class(attribute);

我尝试简单地调用 create 函数并设置t等于返回的指针,但这似乎不起作用,因为在load_construct_data function, 和之后serialization function,给定myClass&的值与我设置的 't' 不同。

我该如何做 ::new(t) 正在做的事情,以便使用 create 函数创建的对象遵循序列化/其他函数?