我有一个与QSharedPointers和QWeakPointers连接的复杂对象网络。有没有一种简单的方法来使用Boost.Serialization保存/加载它们?到目前为止,我有这个:
namespace boost {
namespace serialization {
template<class Archive, class T>
void save(Archive& ar, QSharedPointer<T> const& ptr, unsigned version) {
T* sharedPointer = ptr.data();
ar & BOOST_SERIALIZATION_NVP(sharedPointer);
}
template<class Archive, class T>
void load(Archive& ar, QSharedPointer<T>& ptr, unsigned version) {
T* sharedPointer = 0;
ar & BOOST_SERIALIZATION_NVP(sharedPointer);
ptr = QSharedPointer<T>(sharedPointer);
}
template<class Archive, class T>
void save(Archive& ar, QWeakPointer<T> const& ptr, unsigned version) {
T* weakPointer = ptr.toStrongRef().data();
ar & BOOST_SERIALIZATION_NVP(weakPointer);
}
template<class Archive, class T>
void load(Archive& ar, QWeakPointer<T>& ptr, unsigned version) {
T* weakPointer = 0;
ar & BOOST_SERIALIZATION_NVP(weakPointer);
ptr = QSharedPointer<T>(weakPointer);
}
}
}
这不起作用,因为共享指针总是由原始指针构成,因此它们都认为引用计数为1.它还会立即释放弱指针。
通过一些努力,我可以将类转换为使用boost::shared_ptr
和boost::weak_ptr
。这会有什么好处吗?
答案 0 :(得分:5)
问题是你通过序列化指针真正想要实现什么?你的预期产量是多少?请注意,指针指向内存中的一个位置 - 有几个可能指向内存中的相同位置。
序列化地址不起作用。你不能只记下确切的内存地址,因为没有办法保证下次运行的对象能够占用相同的空间(另一个程序可能已经预留了那个地方)。
在我们有一个指针不会工作的每个地方序列化指向的对象:
现在您考虑一下,您可以尝试boost::serialization
的正式答案: