關(guān)于c++結(jié)構(gòu)體的序列化與反序列化
在現(xiàn)代軟件開發(fā)中,協(xié)議交互是不可或缺的一部分。協(xié)議交互使得不同的系統(tǒng)能夠相互通信和交換數(shù)據(jù),而JSON(JavaScript Object Notation)作為一種輕量級的數(shù)據(jù)交換格式,被廣泛應(yīng)用于協(xié)議交互中。?
首先,讓我們來看一下JSON的結(jié)構(gòu)。JSON使用鍵值對的方式來表示數(shù)據(jù),這種結(jié)構(gòu)非常適合在不同的編程語言之間進(jìn)行數(shù)據(jù)交換。它使用簡單的文本格式,易于理解和編寫,同時(shí)也易于解析和生成。這使得開發(fā)人員能夠快速地處理和解釋數(shù)據(jù),而無需復(fù)雜的解析邏輯。?
其次,JSON具有高度的可讀性。與其他數(shù)據(jù)交換格式相比,如XML,JSON的語法更簡潔、更直觀。它使用了常見的數(shù)據(jù)類型,如字符串、數(shù)字、布爾值和數(shù)組。這使得開發(fā)人員能夠輕松地讀取和理解數(shù)據(jù),無需額外的文檔或解釋。?
?此外,JSON具有良好的兼容性。它可以很容易地與其他編程語言進(jìn)行集成,并且可以在不同的平臺(tái)和環(huán)境中無縫地進(jìn)行數(shù)據(jù)交換。這種靈活性使得開發(fā)人員能夠選擇他們熟悉和喜歡的編程語言進(jìn)行開發(fā),而不必?fù)?dān)心數(shù)據(jù)交換的問題。 JSON還具有可擴(kuò)展性。開發(fā)人員可以根據(jù)自己的需求定義自定義的數(shù)據(jù)結(jié)構(gòu),并將其嵌入到JSON中。這使得協(xié)議交互更加靈活和適應(yīng)性強(qiáng),可以滿足各種不同的需求。?
最后,JSON具有廣泛的支持和社區(qū)。幾乎所有現(xiàn)代編程語言都有JSON的解析和生成庫,這使得開發(fā)人員能夠輕松地在他們的項(xiàng)目中使用JSON。此外,開發(fā)人員可以從社區(qū)中獲取大量的資源、教程和示例代碼,以幫助他們更好地使用JSON進(jìn)行協(xié)議交互。?
綜上所述,JSON作為一種簡單、可讀性高、兼容性好、可擴(kuò)展性強(qiáng)的數(shù)據(jù)交換格式,為程序員們提供了一種方便、高效的方式來進(jìn)行協(xié)議交互。無論是在Web開發(fā)、移動(dòng)應(yīng)用開發(fā)還是其他領(lǐng)域,JSON都是不可或缺的工具之一。?
今天為大家推薦一個(gè)十分好用的序列化工具庫,可將c++中的結(jié)構(gòu)體轉(zhuǎn)化為json結(jié)構(gòu)字符串,這樣更加的便于程序員開發(fā)與外部程序進(jìn)行協(xié)議交互。?
以下舉例如何使用:?
首先我們已知協(xié)議文檔如下:?
變量中文名 ? ?變量名稱 ? ?類型 ? ?
? ? ?姓名 ? ? ? ? ? ?name ? ? string ? ? ?
? ? ?年齡 ? ? ? ? ? ? ?age ? ? ? ? int ? ?
? ? ?工資 ? ? ? ? ? ?salary ? ?double ? ?
? ? ? 性別 ? ? ? ? ? ? ?sex ? ? ? bool(true為男,false為女)
則我們可以在c++中定義以下結(jié)構(gòu)體:
struct Programmer?
{?
std::string ?name;//姓名
int age;//年齡
double salary;//薪資
bool sex;//性別?
};?
將結(jié)構(gòu)體定義為宏,為了后邊序列化反序列化能找到該結(jié)構(gòu)體?
REFLECTION(Programmer, name, age, salary, sex)?
包含頭文件
#include <iostream>?
#include <iguana/json_serializer.hpp>?
int main()?
{?
Programmer test;?
test.name = “小王”;?
test.age = 20;?
test.salary = 3500.00;?
test.sex = true;?
std::string text = iguana::JsonSearializer::Searialize(test);//將類序列化為文本 std::cout<<text<<std::endl;?
Programmer test1;?
iguana::JsonSearializer::Desearialize(text,test1);//反序列化到類中 std::cout<<test1.name<<endl;?
}?
輸出為: {"name":"小王","age":20,"salary":3500.000000,"sex":true}?
“小王”?
這樣,我們就可以簡單的通過c++的結(jié)構(gòu)體來進(jìn)行json字符串的協(xié)議對接了。?
注:此庫需要c++17及以上才可用,若有大家有c++低版本需求后續(xù)可出低版本教程
若大家需要源碼,歡迎移步我的知識星球或私信我。
https://wx.zsxq.com/dweb2/index/group/48884884442118