实现对象跟踪,如在 Boost::Serialization 中
Implementing object tracking, like in Boost::Serialization
我正在为C++中的对象图实现一个"克隆"函数,部分问题是确保如果有两个指向同一对象的指针,它不会被克隆两次。我通过保留一个将原始对象作为键并将克隆版本作为值的map<void*, void*>
来实现这一点。 克隆对象时,我使用模板函数来检查对象是否在映射中 - 如果是,我会用static_cast<T*>
返回它,否则,我会克隆它并将原始对象存储在地图中,并将原始对象克隆到地图中,并隐式转换为void*
。
此方案的问题在于,如果一个对象在两个地方被不同的类型引用(例如,通过接口与具体类型(,则强制转换为void*
可能不会产生相同的值。 这意味着该对象被克隆两次。
我在网上寻找现有的解决方案,并意识到Boost.Serialization必须处理同样的问题。但是在搜索其来源后,我找不到实际跟踪指向对象的指针的部分。
任何人都可以通过建议有效的设计或指出 Boost 代码中执行此操作的部分来提供帮助吗?
在存储之前,使用dynamic_cast<void*>
投射指针 - 这将为您提供指向派生最多的对象的 void 指针;对于相同的对象,此 void 指针将存储相同的地址。
另请参阅此问题。
我不相信boost序列化以某种超级聪明的方式处理这个问题。看看base_object
函数 - 看起来你必须手动说出基类是什么。从这里开始很明显如何获得相同的指针。另请注意,对于序列化派生类,只有虚拟类将以这种方式正确保存,非虚拟类(如标准布局类型(必须序列化派生类。我不知道在这种情况下他们是否处理共享指针。
所以基本的想法是,如果你有一个虚拟类,基必须有一个"串行"函数。如果转换为此基数,则具有公共指针,并且仍然可以调用虚拟串行函数。
您最好只创建一个全局identify<T>
模板,并将其专门用于需要它的所有类型的模板。可能容易出错,但提升方法也绝不能避免错误。
我已经在 boost 序列化方面做了很多工作,但避免了指针逻辑 - 它变得非常混乱,所以我基本上不做那个级别的序列化(我的序列化数据中没有指针(。
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 使用 Boost::Serialization 序列化具有 std::mt19937_64 成员的类
- 如何在Boost Serialization ::存档中抑制额外信息
- 为什么Boost Serialization使用的类版本限制为8位
- C++ Boost.Serialization - 用户定义成员的非侵入式序列化
- 是否有一种方法可以使用Boost Serialization序列化迭代器
- 如何在Boost Serialization中检索多个对象值
- Do grain和Boost Serialization使用零拷贝
- Microsoft Guid guid serialization使用Boost序列化
- boost::serialization-序列化从泛型属性/功能容器派生的类
- 将 Boost.Serialization 直接与虚拟钻石继承一起工作
- 如何在 c++ 中使用 boost:serialization 时解决"sizeof"错误?
- c++11 shared_ptr + Boost::Serialization
- 使用boost.serialization和STL容器作为模板参数
- 调试Boost.Serialization地址跟踪
- C++网络程序设计:Boost Asio、Serialization和OStream
- 使用Boost.Serialization进行序列化
- 如何在Boost serialization中创建用于序列化的接口
- 实现对象跟踪,如在 Boost::Serialization 中
- Boost::Serialization VS2015在Release Mode Mnly中编译错误