3 回答

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