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