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