C++ std:: map을 파일에 직렬화하기



serialization stl (4)

나는 int와 customType의 map 인 C ++ STL map을 가지고있다. customType은 string과 string의리스트를 가진 struct입니다. 이것을 어떻게 serialize 할 수 있습니까?

샘플 구조체 :

struct customType{
string;
string;
int;
list<string>;
}

Answer #1

BOOST를 두려워하지 않으면 BOOST Serialize를 시도하십시오. (템플릿 코드, 여기에 몇 가지 오류가있을 수 있습니다 ...)

#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/list.hpp> 

struct customType{
 string string1;
 string string2;
 int i;
 list<string> list;

// boost serialize 
private: 
    friend class boost::serialization::access; 
    template <typename Archive> void serialize(Archive &ar, const unsigned int version) { 
        ar & string1; 
        ar & string2; 
        ar & i;
        ar & list;
    } 
};

template <typename ClassTo> 
int Save(const string fname, const ClassTo &c) 
{ 
    ofstream f(fname.c_str(), ios::binary);
    if (f.fail()) return -1;
    boost::archive::binary_oarchive oa(f); 
    oa << c; 
    return 0;
} 

용법:

Save< map<int, customType> >("test.map", yourMap); 

Answer #2

C ++에는 Java 및 기타와 같은 리플렉션 기능이 없으므로이를 수행하는 '자동'방법이 없습니다. 파일을 열고 루프의 각 요소를 출력하고 파일을 닫으면 모든 작업을 직접 수행해야합니다. 또한 파일에 대한 표준 형식이 없기 때문에 필요에 맞는 형식을 정의해야합니다. 물론, 거기에 도움이되는 도서관이 있지만 언어의 일부가 아닙니다. 이 질문을보십시오 :

자동으로 C ++ 객체를 직렬화 할 수 있습니까?

또한보십시오 : http://s11n.net/


Answer #3

당신이 이것을 묻는다면, 아마 당신은 이미 다음과 같은 방법으로 이것을 직렬화 할 수 없다는 것을 알고 있습니다 :

file.write( (const char *) &mapOfCustom, sizeof( mapOfCustom ) );

문제는 복잡한 객체 (C ++에서는 심지어 문자열 변수가 복잡한 객체)와 관련이 있습니다. 즉, 자체 포함되지 않은 객체입니다. 사실, 간단한 직렬화조차도 플랫폼 호환성과 컴파일러 호환성 (다른 패딩 등)에 이르기까지 다양한 문제가 있습니다.

한 가지 방법은 tinyXML과 같은 간단한 XML 라이브러리를 사용하는 것입니다.

http://www.grinninglizard.com/tinyxml/

XML에 저장하고 XML 프로 시저에서 복원하십시오.






stl