Tôi có một mạng lưới các đối tượng phức tạp được kết nối với QSharedPointers và QWeakPointers. Có cách nào đơn giản để lưu/tải chúng bằng Boost.Serialization không? Cho đến nay tôi có điều này:Làm thế nào để tuần tự hóa con trỏ chia sẻ/yếu?
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);
}
}
}
Điều này không hoạt động vì con trỏ chia sẻ luôn được xây dựng từ con trỏ thô để tất cả đều nghĩ rằng số tham chiếu là 1. Nó cũng ngay lập tức giải phóng con trỏ yếu.
Với một số nỗ lực, tôi có thể chuyển đổi các lớp học thành sử dụng boost::shared_ptr
và boost::weak_ptr
. Liệu điều đó có tốt không?
Tôi nghĩ giải pháp thứ 2 sẽ phù hợp với tôi, cảm ơn bạn. – stribika