2009-12-18 5 views
6

QSharedPointers 및 QWeakPointers와 연결된 복잡한 개체 네트워크가 있습니다. Boost.Serialization으로 저장 /로드하는 간단한 방법이 있습니까? 그들은 모두 참조 카운트는 또한 즉시 약한 포인터를 해제 1. 생각 있도록 공유 포인터는 항상 원시 포인터로 구성되어 있기 때문이 작동하지공유/약 포인터를 직렬화하는 방법은 무엇입니까?

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); 
     } 
    } 
} 

: 지금까지 나는이 있습니다.

약간의 노력으로 클래스를 boost::shared_ptrboost::weak_ptr으로 변환 할 수 있습니다. 그게 좋은 일 이니?

답변

5

질문은 포인터를 직렬화하여 실제로 달성하고자하는 것이 무엇입니까? 예상되는 결과는 무엇입니까? 포인터는 메모리에있는 장소를 가리킴을 주목하십시오 - 몇몇은 메모리의 같은 장소를 가리킬 수 있습니다.

주소 직렬화가 작동하지 않습니다. 정확한 메모리 주소를 적어 둘 수는 없습니다. 왜냐하면 다음 실행시에 같은 공간을 차지할 수있는 방법이 없기 때문입니다 (다른 프로그램이 이미 그 장소를 예약했을 수도 있음). 우리는 포인터가 각 장소에 뾰족한 물체를 직렬화

일 :

  1. 이것은 우리가 만드는 약한 포인터를 가지고 있다면 우리는
  2. 직렬화해야 할 것입니다 더 많은 데이터가 될 것입니다 순환 종속성은 나중에 연결을 중지하고 검색 할 수 없습니다.

를 역 직렬화 할 때

  • 하나에 같은 객체를 병합 할 방법이 없습니다, 당신은 boost::serialization의 공식적인 답변을 시도 할 수 있습니다
  • +0

    제 2의 해결책이 저에게 효과가 있다고 생각합니다. 감사합니다. – stribika