Cereal은 C++ 11에서 데이터 직렬화를 쉽게 할 수 있게 하는 라이브러리이다.
특히 헤더파일만 포함시키면 바로 사용할 수 있는 간단한 라이브러리다.
Cereal은 Binary Serialize, XML Serialize, JSON Serialize를 지원한다.
다운로드 |
우측 상단의 "Download"를 선택하여 다운로드 한다.
압축을 풀게되면
위와 같이 파일들이 나오게되는데 "include" 폴더를 그대로 복사하여 사용하려는 프로젝트로 옮긴다.
자신이 사용하려는 프로젝트 내부로 옮긴 이후 include 하여 사용하면 끝이다.
아래에 설명할 사용법은
위의 깃허브 페이지에서 더 자세히 볼 수 있다.
간단한 사용법 |
간단하게 구조체를 Binary Serialize하여 입출력하는 법을 알아본다.
먼저 데이터 구조체를 하나 만든다.
#include "Cereal/types/string.hpp" // string 자료형을 사용하기 때문에 추가
#include "Cereal/types/vector.hpp" // vector를 사용하기 때문에 추가
struct DataStruct
{
int nA;
int nB;
double dC;
vector<string> vString;
template <class Archive>
void serialize(Archive& archive)
{
archive(nA, nB, dC, vString);
}
};
(#include 경로는 각자의 경로에 맞게 설정하면 된다.)
이 중에서 중요한 포인트는 "serialize" 함수이다.
해당 부분은 꼭 선언해주어야 한다.
구조체 내부의 변수들을 그대로 인자로 넣어주면 된다.
(자세한 내용은 아래의 링크에서 확인)
이제 저 구조체를 직렬화하여 보자.
#include "Cereal/archives/binary.hpp" // Binary 직렬화를 위한 선언
void DataPrint(DataStruct data)
{
printf("data1 : nA(%d), nB(%d), dC(%f), vString(", data.nA, data.nB, data.dC);
for_each(data.vString.begin(), data.vString.end(), [](string& str) {
printf("%s ", str.c_str());
});
printf(")\n");
}
int main(void)
{
// 데이터 출력
ofstream out("Test.dat", ios::binary);
{
cereal::BinaryOutputArchive oArchives(out);
DataStruct data1;
{
data1.nA = 1;
data1.nB = 2;
data1.dC = 3.3;
data1.vString.push_back("한글입니다.");
data1.vString.push_back("English");
data1.vString.push_back("Data 저장 확인");
}
DataStruct data2;
{
data2.nA = 10;
data2.nB = 20;
data2.dC = 30.3;
data2.vString.push_back("옜다.");
data2.vString.push_back("Take it.");
data2.vString.push_back("Remix 뤼믹스");
}
oArchives(data1, data2);
out.close();
}
// 데이터 입력
ifstream in("Test.dat", ios::binary);
{
cereal::BinaryInputArchive iArchives(in);
DataStruct data1;
DataStruct data2;
iArchives(data1, data2);
DataPrint(data1);
DataPrint(data2);
in.close();
}
system("pause");
return 0;
}
핵심 포인트는 "BinaryOutputArchive"와 "BinaryInputArchive"이다.
위의 테스트 예제는 첨부파일에서 다운로드 할 수 있다.
'Study > C++' 카테고리의 다른 글
[C++11] 스마트 포인터3 (weak_ptr) (0) | 2022.09.21 |
---|---|
[C++11] 스마트 포인터2 (shared_ptr) (1) | 2022.09.20 |
[C++11] 스마트 포인터1 (unique_ptr) (0) | 2022.09.19 |
[C++] std::array (C++ 표준 라이브러리 배열 컨테이너 이야기) (0) | 2022.09.18 |
[C++] Google 공룡 게임 만들어보기 (2) | 2022.02.05 |