第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

用C語言序列化數(shù)據(jù)結(jié)構(gòu)

用C語言序列化數(shù)據(jù)結(jié)構(gòu)

C
互換的青春 2019-08-26 19:02:58
用C語言序列化數(shù)據(jù)結(jié)構(gòu)我想要一個(gè)可以將我的數(shù)據(jù)結(jié)構(gòu)序列化到磁盤的C庫,然后再加載它們。它應(yīng)該接受任意嵌套的結(jié)構(gòu),可能使用循環(huán)引用。我認(rèn)為這個(gè)工具需要一個(gè)描述我的數(shù)據(jù)結(jié)構(gòu)的配置文件。允許庫使用代碼生成,盡管我很確定沒有它就可以這樣做。注意我對(duì)數(shù)據(jù)可移植性不感興趣。我想將它用作緩存,所以我可以依賴不改變的環(huán)境。謝謝。結(jié)果有人建議Tpl是一個(gè)很棒的庫,但我相信它不會(huì)做任意的對(duì)象圖,例如每個(gè)包含兩個(gè)其他節(jié)點(diǎn)的節(jié)點(diǎn)樹。另一個(gè)候選人是Eet,這是Enlightenment窗口管理器的一個(gè)項(xiàng)目。看起來很有趣但是,似乎沒有能力序列化嵌套結(jié)構(gòu)。
查看完整描述

3 回答

?
吃雞游戲

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

看看tpl。從概述:

Tpl是一個(gè)用于序列化C數(shù)據(jù)的庫。數(shù)據(jù)以其自然二進(jìn)制形式存儲(chǔ)。API很小,并試圖保持“不礙事”。與使用XML相比,tpl在C程序中使用更快,更容易。Tpl可以序列化許多C數(shù)據(jù)類型,包括結(jié)構(gòu)。


查看完整回答
反對(duì) 回復(fù) 2019-08-26
?
海綿寶寶撒

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)樾蛄谢^程帶來一些特定于案例的智能。


查看完整回答
反對(duì) 回復(fù) 2019-08-26
  • 3 回答
  • 0 關(guān)注
  • 1134 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)