2008-11-04 17 views

Trả lời

1

Tôi không biết nhiều về MFC, nhưng vấn đề của bạn được thay trivially giải quyết bằng 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; 
} 

Và sau đó là bạn muốn làm việc lưu trữ thực:

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

Vậy là xong .

(từ chối trách nhiệm: Mã đơn giản là gõ vào ô này, không được kiểm tra ở tất cả, lỗi đánh máy của được dự định;)

+0

Cảm ơn bạn! Sử dụng tăng là một lựa chọn tốt. Tuy nhiên, tôi đã tìm ra cách tiếp cận sử dụng CArchive. Ý tưởng chính của phương pháp tiếp cận của tôi là sắp xếp từng phần tử của bản đồ. – user26404

7

Trong MFC, tôi tin rằng đó là dễ dàng nhất để đầu serialize kích thước của bản đồ, và sau đó chỉ cần lặp qua tất cả các yếu tố.

Bạn không nói rõ nếu bạn sử dụng std::map hoặc MFC của CMap, nhưng một phiên bản dựa trên std::map có thể trông như thế này:

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

Nếu xảy ra lỗi khi đọc các kho lưu trữ, một trong những hoạt động trực tuyến nên ném một ngoại lệ, mà sau đó sẽ bị bắt bởi khuôn khổ ở cấp độ cao hơn.

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