【2012年度末まとめ】その5 GUIDとクラスのシリアル化
5968 ワード
//GUIDを生成し、GUID生成に失敗した場合は乱数で一意符号化する
1 // GUID;
2 CString MakeGUID()
3 {
4 GUID guid;
5 CString szGUID;
6
7 // GUID GUID;
8 if (S_OK == ::CoCreateGuid(&guid))
9 {
10 TCHAR chFormat[] = _T("%08X%04X%04x%02X%02X%02X%02X%02X%02X%02X%02X");
11 szGUID.Format( chFormat
12 , guid.Data1
13 , guid.Data2
14 , guid.Data3
15 , guid.Data4[0], guid.Data4[1]
16 , guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5]
17 , guid.Data4[6], guid.Data4[7]
18 );
19
20 return szGUID;
21 }
22
23 int r = rand() % 10000 + rand() % 1000 + rand() % 100 + rand() & 10 + rand();
24
25 char chArray[MAX_ARRAY_LENTH] = {0};
26 _itoa_s(r, chArray, sizeof(chArray));
27
28 szGUID = CString(chArray);
29
30 return szGUID;
31
32
33 }
//クラスのシリアル化
//クラスのシリアル化は5つの条件を満たす
//1、CObjectから引き継ぐ
//2、DECLARE_の宣言SERIAL(クラス名)
//3、実現void Serialize(CArchive&ar)
//4、IMPLEMENT_SERIAL(クラス名、CObject、バージョン番号)
//5、パラメータを持たない構造関数がある
//KeyFile.h
1 class CKeyFile : public CObject
2
3 {
4
5 public:
6
7 DECLARE_SERIAL(CkeyFile)
8
9 CKeyFile(void);
10
11 void Serialize(CArchive& ar);
12 protected:
13
14 int m_nAge;
15
16 string m_strName;
17
18 }
//KeyFile.cpp
1 IMPLEMENT_SERIAL(CKeyFile, CObject, 1)
2
3
4
5 CKeyFile::CKeyFile()
6
7 {
8
9 //codes
10
11 }
12
13
14
15 void CKeyFile::Serialize(CArchive& ar)
16
17 {
18
19 //
20
21 if(ar.IsStoring()) //
22
23 {
24
25 ar<<m_nAge<<m_strName;
26 }
27
28 else //
29
30 {
31
32 ar>>m_nAge>>m_strName;
33 }
34
35 }
//main.cpp
1 int _tmain(int argc, TCHAR* argv[], TCHAR* envn[])
2
3 {
4
5 //
6
7 CFile writeFile(fileName, CFile::modeCreate | CFile::modeWrite);
8
9 CArchive ar(&writeFile, CArchive::store);
10
11 CKeyFile objFile;
12
13 // objFile
14
15 objFile.Serialize(ar);
16
17
18
19 //
20
21 CFile readFile(fileName, CFile::modeRead);
22
23 CArchive ar2(&readFile, CArchive::load);
24
25 CKeyFile objFile2;
26
27 objFile2.Serialize(ar2);
28
29
30
31 }