消息的序列化與反序列化
1、定義:
- 序列化:將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換為可傳輸或存儲(chǔ)的格式(如二進(jìn)制流、JSON 字符串)。
- 反序列化:將序列化后的數(shù)據(jù)還原為原始數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟆?
2、核心作用
- 跨網(wǎng)絡(luò)傳輸:將對象轉(zhuǎn)換為字節(jié)流,便于網(wǎng)絡(luò)傳輸。
- 跨語言交互:通過統(tǒng)一格式(如 Protobuf)實(shí)現(xiàn)多語言兼容。
- 持久化存儲(chǔ):將對象保存到文件或數(shù)據(jù)庫。
3、消息序列化與反序列化的核心優(yōu)點(diǎn)
二進(jìn)制協(xié)議壓縮數(shù)據(jù)體積,提升網(wǎng)絡(luò)傳輸效率,降低帶寬消耗;統(tǒng)一數(shù)據(jù)格式(如 JSON/Protobuf),實(shí)現(xiàn)多語言系統(tǒng)無縫交互;支持將對象轉(zhuǎn)換為可存儲(chǔ)格式(如文件、數(shù)據(jù)庫),便于長期保存和恢復(fù);Schema 定義支持字段增刪,保障版本向前/向后兼容;結(jié)構(gòu)化數(shù)據(jù)格式減少注入攻擊風(fēng)險(xiǎn),結(jié)合校驗(yàn)機(jī)制提升安全性。
4、序列化與反序列化在go語言中的使用
在Go語言中,gob和json是兩種常見的數(shù)據(jù)序列化和反序列化方式,用于將Go語言中的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為字節(jié)流或字符串,以便存儲(chǔ)或傳輸,同時(shí)也可以將字節(jié)流或字符串還原為Go語言中的數(shù)據(jù)結(jié)構(gòu)
-
gob
gob是Go語言標(biāo)準(zhǔn)庫中的一個(gè)包,專門用于序列化和反序列化Go語言的數(shù)據(jù)結(jié)構(gòu)。它主要用于Go語言內(nèi)部的數(shù)據(jù)傳輸,例如網(wǎng)絡(luò)通信或文件存儲(chǔ)。
-
特點(diǎn)
gob是為Go語言設(shè)計(jì)的,對Go語言的數(shù)據(jù)結(jié)構(gòu)支持非常好,序列化和反序列化速度較快;gob在序列化時(shí)會(huì)保留類型信息,因此在反序列化時(shí)可以還原為原始類型;gob格式是Go語言特有的,不適合與其他語言交互。
-
json
json是JavaScript Object Notation的縮寫,是一種輕量級的數(shù)據(jù)交換格式,廣泛用于各種編程語言之間的數(shù)據(jù)傳輸。
-
特點(diǎn)
json格式被廣泛支持,幾乎所有的編程語言都有相應(yīng)的庫來處理json數(shù)據(jù);;json格式的文本可讀性較好,便于調(diào)試和查看;json支持多種數(shù)據(jù)類型,包括對象、數(shù)組、字符串、數(shù)字、布爾值等。使用建議
- 只需要在Go語言內(nèi)部進(jìn)行數(shù)據(jù)傳輸,且對性能要求較高,推薦使用gob。
- 需要與其他語言交互,或者需要將數(shù)據(jù)存儲(chǔ)為可讀的文本格式,推薦使用json數(shù)據(jù)格式
5、簡單示例
// 序列化
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
user := User{Name: "Alice", Age: 30}
data, _ := json.Marshal(user) // 輸出: {"name":"Alice","age":30}
// 反序列化
var newUser User
json.Unmarshal(data, &newUser)
fmt.Println(newUser.Name) // 輸出: Alice