3 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
我知道你要的是一個(gè)圖書館。如果你找不到一個(gè)(:: boggle ::,你認(rèn)為這是一個(gè)已經(jīng)解決的問題!),這里有一個(gè)解決方案的大綱:
您應(yīng)該能夠編寫代碼生成器[1]來序列化樹/圖,而無需(運(yùn)行時(shí))預(yù)處理相當(dāng)簡(jiǎn)單。
您需要解析節(jié)點(diǎn)結(jié)構(gòu)(typedef
處理?),并以直接的方式編寫包含的數(shù)據(jù)值,但要小心處理指針。
對(duì)于指向
char *name;
您知道單獨(dú)引用的其他對(duì)象(即)的指針,您可以直接序列化目標(biāo)數(shù)據(jù)。對(duì)于可能被多次引用的對(duì)象以及樹的其他節(jié)點(diǎn),您必須表示指針結(jié)構(gòu)。每個(gè)對(duì)象都被分配一個(gè)序列號(hào),這是指針寫入的內(nèi)容。保持當(dāng)前內(nèi)存位置和序列號(hào)之間的轉(zhuǎn)換結(jié)構(gòu)。在遇到指針時(shí),查看它是否已經(jīng)分配了一個(gè)數(shù)字,如果沒有,則給它一個(gè)并將該對(duì)象排隊(duì)以進(jìn)行序列化。
回讀還需要一個(gè)節(jié)點(diǎn) - #/內(nèi)存位置轉(zhuǎn)換步驟,并且在兩次傳遞中可能更容易做到:用指針槽中的節(jié)點(diǎn)號(hào)重新生成節(jié)點(diǎn)(壞指針,被警告)以找出每個(gè)節(jié)點(diǎn)獲得的位置放,然后再次走結(jié)構(gòu)固定指針。
我對(duì)tpl一無所知,但你可能會(huì)捎帶它。
磁盤/網(wǎng)絡(luò)格式應(yīng)該包含一些類型信息。你需要一個(gè)名稱修改方案。
[1] ROOT使用這種機(jī)制在C ++中提供非常靈活的序列化支持。
遲到:我覺得這并不總是像我上面暗示的那樣容易??紤]以下(設(shè)計(jì)和設(shè)計(jì)不當(dāng))聲明:
enum { mask_none = 0x00, mask_something = 0x01, mask_another = 0x02, /* ... */ mask_all = 0xff};typedef struct mask_map { int mask_val; char *mask_name;} mask_map_t;mask_map_t mask_list[] = { {mask_something, "mask_something"}, {mask_another, "mask_another"}, /* ... */};struct saved_setup { char* name; /* various configuration data */ char* mask_name; /* ... */};
并假設(shè)我們初始化struct saved_setup
項(xiàng)目以便mask_name
指向mask_list[foo].mask_name
。
當(dāng)我們?nèi)バ蛄谢瘮?shù)據(jù)時(shí),我們?cè)撛趺醋?code>struct saved_setup.mask_name?
您需要注意設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)和/或?yàn)樾蛄谢^程帶來一些特定于案例的智能。
- 3 回答
- 0 關(guān)注
- 1134 瀏覽
添加回答
舉報(bào)