计算机网络 之 【自定义协议、序列化与反序列化】(C++使用JSON示例)
目录1.自定义协议与序列化/反序列化2.Json简介Json是什么第三方库提供使用时包含头文件JSON 的数据类型JSON结构示例C使用JSON示例1.自定义协议与序列化/反序列化协议的必要性协议是通信双方的约定它定义了数据的格式和含义只有双方遵循同一协议才能正确地解析数据自定义协议就是根据特定需求设计的私有协议通常用于内部系统或专用场景直接发送结构体存在的问题我们使用结构体将数据结构化但却不推荐通信双方直接发送结构体直接发送内存中的结构体存在平台依赖问题不同编译器/平台的对齐规则 可能导致结构体大小不同。字节序大小端 不同。版本兼容性结构体字段增减会导致解析失败。因此需要将结构化数据序列化为字节流如字符串、二进制格式再发送接收方再反序列化恢复为结构。常见序列化方式JSON、XML、Protocol Buffersprotobuf、MessagePack 等2.Json简介Json是什么JSON是一种轻量级的数据交换格式序列化与反序列化完全独立于语言和平台数据以“键-值”对的形式组织键Key必须是字符串值Value可以是多种数据类型第三方库提供使用时包含头文件sudo apt install libjsoncpp-dev //安装 #include jsoncpp/json/json.h //包含头文件JSON 的数据类型JSON 的值Value只能是以下六种类型之一字符串String 必须用双引号包裹。示例Hello, World!,张三,123(注意用双引号包裹的数字也是字符串)数字Number 整数或浮点数不需要引号。示例100,3.14,-5,6.02e23对象Object 一个无序的“键/值”对集合。用花括号{}包裹。示例{name: Alice, age: 30}数组Array 值的有序列表。用方括号[]包裹。示例[apple, banana, cherry]布尔值Booleantrue或false小写无引号。示例true,falsenull 表示空值。示例null重要规则键必须是字符串并且必须用双引号包裹不能有注释。 JSON 是纯数据格式不支持 // 或 /* */ 注释。不能有尾随逗号。 数组或对象的最后一个元素后面不能有逗号。错误 {name: Bob, age: 25,} age 后面的逗号是非法的正确 {name: Bob, age: 25}JSON结构示例{ name: John Doe, age: 30, isStudent: false, hobbies: [reading, swimming, coding], address: { street: 123 Main St, city: Anytown, zipCode: 12345 }, spouse: null, favoriteNumbers: [7, 42, 3.14], emptyObject: {}, emptyArray: [] }最外层是一个 JSON 对象 ({...})。它包含多个键值对name 的值是字符串 John Doeage 的值是数字 30isStudent 的值是布尔值 falsehobbies 的值是一个数组 [reading, swimming, coding]数组里面是三个字符串。address 的值是另一个对象这个对象又包含三个键值对街道、城市、邮编。spouse 的值是 null。favoriteNumbers 的值是一个数组里面混合了整数和浮点数。emptyObject 的值是一个空对象。emptyArray 的值是一个空数组。C使用JSON示例#include iostream 2 #include jsoncpp/json/json.h 3 4 int main() 5 { 6 Json::Value part1; 7 part1[haha] haha; 8 part1[hehe] hehe; 9 10 Json::Value root;//万能对象 11 root[x] 100; 12 root[y] 100; 13 root[op] ; 14 root[desc] this is a oper; 15 root[test] part1; 16 //序列化 17 Json::FastWriter w; 18 // Json::StyledWriter w; 19 std::string res w.write(root); 20 std::cout res std::endl; 21 //反序列化 22 Json::Value v; 23 Json::Reader r; 24 r.parse(res, v); 25 int x v[x].asInt(); 26 int y v[y].asInt(); 27 char op v[op].asInt(); 28 res v[desc].asString(); 29 //输出结果 30 std::cout res std::endl; 31 std::cout x op y std::endl; 32 33 34 return 0; 35 }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2454416.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!