簡體   English   中英

從C ++序列化Lua表(通過JSON)

[英]Serialize Lua Table from C++ (via JSON)

我想將復雜的數據從C ++服務傳遞到Lua應用程序。 該通信通過網絡進行。 為了簡化和提高Lua應用程序的速度,我寧願發送文字Lua表文字(不需要單獨的解析器),而不是發送XML或JSON或YAML等。

盡管存在諸如編寫JSON的C ++庫之類的東西,但我找不到用於創建序列化Lua的現有C ++庫。 然后,我的想法是將現有的JSON庫用於C ++,然后將字符串轉換為Lua。

因此,例如,我想轉換此字符串:

{
  "hello":42,
  "array":[1,2,{"more":false},null,true],
  "worst":"still [null]: got it?"
}

到這個字符串中:

{
  ["hello"]=42,
  ["array"]={1,2,{["more"]=false},nil,true},
  ["worst"]="still [null]: got it?"
}

天真的replace_all轉換為:=[]{} ,將nullnil會破壞字符串內部的內容。 如何執行此轉換?

為了避免XY問題,我在標題和標題中都加入了最終動機,以防JSON-> Lua字符串轉換是錯誤的選擇。

我自己編寫Lua格式序列化庫的代碼。 您可以選擇一個免費軟件 Json C ++庫(例如jsoncpplibjson ),並很容易地調整其代碼(以您的Lua格式)。

當然,您應該服從該庫的許可,我強烈建議您將Lua格式的序列化庫本身設置為免費軟件,例如在github和/或freecode和/或sourceforge上

關鍵是, JSON (並希望您的Lua格式)足夠簡單,以使其解析或打印變得相當容易...將現有的庫改編為您的格式可能比“后處理”其輸出更簡單,當然也更快。

盡管我今天並不是很容易找到它,但我記得在一年多以前,在Lua列表上曾進行過討論,它的優點是定義一個類似於JSON的Lua表文字的有限子集,為便於討論,被稱為“ LSON” 。 IIRC達成的共識是,僅使用已建立的標准輕量級格式(例如JSON)並沒有足夠的好處,但是我知道已經進行了一些實驗。

這個lson.lua Github Gist演示了一個用純Lua編寫的簡單LSON作家和讀者。 根據該代碼,編寫者僅需花費很少的精力就可以轉換為C或C ++。 該代碼的關鍵特征在於,它提供了針對循環引用和可以存儲在表中的數據類型的某種保護,但這些數據類型沒有作為源代碼編寫的合理機制( userdatathread在任何情況下都很難序列化)形成)。 當然,對於僅以輕量級結構在C中作為普通舊數據發起的數據,無論如何您都不會遇到任何有問題的數據類型。 它還可以防止循環引用。 如果從C序列化列表或樹,則通過構造可能無法使用循環引用。 如果沒有,您將需要自己處理。

請注意,使用Lua自己的解析器可能會引入安全性問題。 最明顯的問題是,僅編寫assert(loadstring('return '..Input))()允許導入的文本訪問您當前的整個環境。 盡管在輸入文本之外應用return關鍵字會帶來一些保護,但仍不能防止巧妙地使用可以從表達式中調用的任何函數。 為了獲得最佳安全性,您可能需要閱讀有關沙箱的信息 ,甚至可能在盲目執行之前應用一些巧妙的技巧來限制已編譯的字節碼。

安全性問題可能是支持限定和使用JSON解析器的強烈理由。 甚至javascipt應用程序通常也更喜歡使用JSON解析器,而不僅僅是讓javascript引擎執行不受信任的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM