2009-12-18 26 views
6

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_ptrboost::weak_ptr. Liệu điều đó có tốt không?

Trả lời

5

Câu hỏi đặt ra là bạn thực sự muốn đạt được điều gì bằng cách nối tiếp con trỏ? Sản lượng dự kiến ​​của bạn là gì? Lưu ý rằng con trỏ trỏ đến một nơi trong bộ nhớ - một số có thể trỏ đến cùng một vị trí trong bộ nhớ.

Việc tuần tự hóa địa chỉ sẽ không hoạt động. Bạn không thể chỉ ghi lại địa chỉ bộ nhớ chính xác, bởi vì không có cách nào để đảm bảo rằng các đối tượng trong lần chạy tiếp theo sẽ có thể lấy cùng một không gian (một chương trình khác có thể đã dành chỗ đó).

Serializing đối tượng nhọn ở mỗi nơi mà chúng tôi có một con trỏ sẽ không công việc:

  1. Đây sẽ là dữ liệu rất nhiều mà chúng tôi cần phải serialize
  2. Nếu chúng ta có con trỏ yếu tạo một phụ thuộc vòng tròn, chúng tôi sẽ không thể dừng lại và truy xuất kết nối đó sau đó.
  3. Không có cách nào để hợp nhất các đối tượng tương tự vào một khi deserializing

Bây giờ bạn nghĩ về nó, bạn có thể thử các câu trả lời chính thức của boost::serialization:

+0

Tôi nghĩ giải pháp thứ 2 sẽ phù hợp với tôi, cảm ơn bạn. – stribika

Các vấn đề liên quan