2008-11-04 2 views

답변

1

나는 MFC에 대해 잘 모르겠지만, 문제는 오히려 하찮게 Boost.Serialization

struct MapData { 
    int m_int; 
    std::string m_str; 

    private: 
    friend class boost::serialization::access; 

    template<class Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
     ar & m_int; 
     ar & m_str; 
    } 
}; 

std::map< int, MapData > theData; 

template<class Archive> 
void serialize(Archive & ar, std::map< int, MapData > & data, const unsigned int version) 
{ 
    ar & data; 
} 

그리고 나중에 진짜 보관하고 싶어했다 사용하여 해결된다 :

std::ofstream ofs("filename"); 
boost::archive::binary_oarchive oa(ofs); 
oa << theData; 

예요 .

(면책 조항 : 단순히 전혀 테스트되지 않은이 상자에 입력 한 코드, 오타의 의도 된) MFC에서

+0

감사합니다. 부스트를 사용하는 것이 좋습니다. 그러나, 나는 CArchive를 사용하는 접근법을 연구했다. 내 접근 방식의 주요 아이디어는지도의 모든 요소를 ​​직렬화하는 것입니다. – user26404

7

, 내가 먼저지도의 크기를 직렬화하는 가장 쉬운 방법 생각하고 간단하게 모든 반복 요소들.

당신이 std::map를 사용하거나 MFC의 CMap하지만 std::map에 따라 버전은 다음과 같이 할 수 있다면 당신은 지정하지 않은 :

void MyClass::Serialize(CArchive& archive) 
{ 
    CObject::Serialize(archive); 
    if (archive.IsStoring()) { 
    archive << m_map.size(); // save element count 
    std::map<int, MapData>::const_iterator iter = m_map.begin(), 
              iterEnd = m_map.end(); 
    for (; iter != iterEnd; iter++) { 
     archive << iter->first << iter->second; 
    } 
    } 
    else { 
    m_map.clear(); 
    size_t mapSize = 0; 
    archive >> mapSize; // read element count 
    for (size_t i = 0; i < mapSize; ++i) { 
     int key; 
     MapData value; 
     archive >> key; 
     archive >> value; 
     m_map[key] = value; 
    } 
    } 
} 

을 보관, 스트리밍 작업 중 하나를 읽을 때 에러가 발생하면해야 예외를 던지면 더 높은 수준의 프레임 워크에 걸리게됩니다.

관련 문제