成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

golang序列化方法有哪些

golang序列化方法有:1、利用Gob包管理gob流,gob是和類型綁定的,如果發現多了或者少了,會依據順序填充或者截斷。2、利用json包,能實現RFC 7159中定義的JSON編碼和解碼;在序列化的過程中,如果結構體內的成員是小寫的,則會出現錯誤。3、利用Binary包,能實現數字和字節序列之間的簡單轉換以及varint的編碼和解碼。4、利用protobuf協議。

golang序列化方法有哪些

本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

在編程過程中,我們總是要遇到這樣的問題,就是將我們的數據對象要在網絡中傳輸或保存到文件,這就需要對其編碼和解碼動作。

目前存在很多編碼格式:json, XML, Gob, Google Protocol Buffer 等,在Go 語言中,如何對數據進行這樣的編碼和解碼呢?

序列化和反序列化定義

序列化 (Serialization)是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。

反過來,把變量從從存儲區中重新讀取,重新創建該對象,則為反序列化。

在Go語言中,encoding 包就是專門來處理這類序列化的編碼和解碼的問題。

序列化方式–Gob

gob 包管理 gob 流–編碼器(發送器)和解碼器(接收器)之間交換的二進制值。一個典型的用途是傳輸遠程過程調用(RPCs)的參數和結果,如 "net/rpc "包中就使用了gobs 流。

具體可以參考文檔:https://docs.studygolang.com/pkg/encoding/gob/

他的官網給出了一個示例:

package main  import ( 	"bytes" 	"encoding/gob" 	"fmt" 	"log" )  type P struct { 	X, Y, Z int 	Name    string }  type Q struct { 	X, Y *int32 	Name string }  // This example shows the basic usage of the package: Create an encoder, // transmit some values, receive them with a decoder. func main() { 	// Initialize the encoder and decoder. Normally enc and dec would be 	// bound to network connections and the encoder and decoder would 	// run in different processes. 	var network bytes.Buffer        // Stand-in for a network connection  //Buffer是具有Read和Write方法的可變大小的字節緩沖區。 	enc := gob.NewEncoder(&network) // Will write to network. 	dec := gob.NewDecoder(&network) // Will read from network.  	// Encode (send) some values. 	err := enc.Encode(P{3, 4, 5, "Pythagoras"}) 	if err != nil { 		log.Fatal("encode error:", err) 	} 	err = enc.Encode(P{1782, 1841, 1922, "Treehouse"}) 	if err != nil { 		log.Fatal("encode error:", err) 	}  	// Decode (receive) and print the values. 	var q Q 	err = dec.Decode(&q) 	if err != nil { 		log.Fatal("decode error 1:", err) 	} 	fmt.Printf("%q: {%d, %d}n", q.Name, *q.X, *q.Y) 	err = dec.Decode(&q) 	if err != nil { 		log.Fatal("decode error 2:", err) 	} 	fmt.Printf("%q: {%d, %d}n", q.Name, *q.X, *q.Y)  }
登錄后復制

運行結果是:

"Pythagoras": {3, 4} "Treehouse": {1782, 1841}
登錄后復制

個人認為這個例子是真的好。我們看到,結構體PQ 是不同的,我們看到Q 少了一個 Z 變量。

但是,在解碼的時候,仍然能解析得出來,這說明,使用 gob 時,是根據類型綁定的,如果發現多了或者少了,會依據順序填充或者截斷。

接下來,我們詳情說說怎么編碼吧:

1. bytes.Buffer 類型

首先,我們需要定義一個 bytes.Buffer 類型,用來承接需要序列化的結構體,這個類型是這樣的:

// A Buffer is a variable-sized buffer of bytes with Read and Write methods.(Buffer是具有Read和Write方法的可變大小的字節緩沖區) // The zero value for Buffer is an empty buffer ready to use. type Buffer struct { 	buf      []byte // contents are the bytes buf[off : len(buf)] 	off      int    // read at &buf[off], write at &buf[len(buf)] 	lastRead readOp // last read operation, so that Unread* can work correctly. }
登錄后復制

使用上面的例子,可以看到輸出是:

"Pythagoras": {3, 4} ==> {[42 255 129 3 1 1 1 80 1 255 130 0 1 4 1 1 88 1 4 0 1 1 89 1 4 0 1 1 90 1 4 0 1 4 78 97 109 101 1 12 0 0 0 21 255 130 1 6 1 8 1 10 1 10 80 121 116 104 97 103 111 114 97 115 0] 0 0}
登錄后復制

可以看到,Buffer 里,是二進制數(一個字節8個bit,最高255)

2. Encode 編碼

之后,對需要編碼序列化的結構體進行編碼:

enc := gob.NewEncoder(&network) // Will write to network. // Encode (send) some values. if err := enc.Encode(P{3, 4, 5, "Pythagoras"}); err != nil { 	log.Fatal("encode error:", err) }
登錄后復制

這里,首先是要獲得 *Encoder 對象,獲得對象后,利用 *Encoder 對象的方法 Encode 進行編碼。

這里,需要注意的是,Encode 如果是網絡編程的,其實是可以直接發送消息給對方的,而不必進行 socket 的send 操作。

比如:在 srever 端有代碼:

func main() { 	l, err := net.Listen("tcp", "127.0.0.1:8000")  //監聽端口 	if err != nil { 		log.Fatal("net Listen() error is ", err) 	}  	p := P{ 		1, 2, 3, 		"name"}  	conn, err := l.Accept() 	if err != nil { 		log.Fatal("net Accept() error is ", err) 	} 	defer func() { _ = conn.Close() }() 	//參數是conn 時,即可發出 	enc := gob.NewEncoder(conn) 	if err = enc.Encode(p); err != nil {  //發生結構體數據 		log.Fatal("enc Encode() error is ", err) 	} }
登錄后復制

在客戶端client有:

func main() { 	conn,err := net.Dial("tcp","127.0.0.1:8000") 	if err != nil { 		log.Fatal("net Dial() error is ", err) 	} 	defer func() { _ = conn.Close() }() 	/** 	type Q struct { 		X, Y int 		Name string 	} 	 */ 	var q Q 	dec := gob.NewDecoder(conn) 	if err = dec.Decode(&q); err != nil { 		log.Fatal("enc Encode() error is ", err) 	} 	fmt.Println(q) }
登錄后復制

輸出:

{1 2 name}
登錄后復制

3. Decode 解碼

最后,對其解碼的步驟為:

dec := gob.NewDecoder(&network) // Will read from network. if err = dec.Decode(&q);err != nil { 	log.Fatal("decode error 2:", err) }
登錄后復制

序列化方式–json

json 包實現了 RFC 7159 中定義的 JSON 編碼和解碼。JSON和Go值之間的映射在 Marshal 和 Unmarshal 函數的文檔中進行了描述。

有關此程序包的介紹,請參見“ JSON和Go”:https://www.php.cn/link/241200d15bc67211b50bd10815259e58json/

示例如下:

type Message struct { 	QQ      string 	Address string }  type Student struct { 	Id   uint64 `json:"id"` //可以保證json字段按照規定的字段轉義,而不是輸出 Id 	Age  uint64 `json:"age"` 	Data []Message }  func main() { 	m1 := Message{QQ: "123", Address: "beijing"} 	m2 := Message{QQ: "456", Address: "beijing"} 	s1 := Student{3, 19, append([]Message{}, m1, m2)} 	var buf []byte 	var err error  	if buf, err = json.Marshal(s1); err != nil { 		log.Fatal("json marshal error:", err) 	}  	fmt.Println(string(buf))  	var s2 Student 	if err = json.Unmarshal(buf, &s2); err != nil { 		log.Fatal("json unmarshal error:", err) 	} 	fmt.Println(s2) } //輸出: //{"id":3,"age":19,"Data":[{"QQ":"123","Address":"beijing"},{"QQ":"456","Address":"beijing"}]} //{3 19 [{123 beijing} {456 beijing}]}
登錄后復制

注意

在序列化的過程中,如果結構體內的成員是小寫的,則會出現錯誤。以上兩種方式,都會出現這樣的結果

我們以 json 序列化為例子,看一下如果是小寫的話,會出現什么樣的結果:

package main  import ( 	"encoding/json" 	"fmt" 	"log" )  type Message struct { 	qq      string 	address string }  type Student struct { 	Id   uint64 `json:"id"` //可以保證json字段按照規定的字段轉義,而不是輸出 Id 	Age  uint64 `json:"age"` 	Data []Message }  func main() { 	m1 := Message{"123", "beijing"} 	m2 := Message{"456", "beijing"} 	s1 := Student{3, 19, append([]Message{}, m1, m2)} 	var buf []byte 	var err error  	if buf, err = json.Marshal(s1); err != nil { 		log.Fatal("json marshal error:", err) 	}  	fmt.Println(string(buf))  	var s2 Student 	if err = json.Unmarshal(buf, &s2); err != nil { 		log.Fatal("json unmarshal error:", err) 	} 	fmt.Println(s2) }
登錄后復制

輸出:

{"id":3,"age":19,"Data":[{},{}]} {3 19 [{ } { }]}
登錄后復制

我們看到,小寫的部分將不會被序列化到,也就是說,會是空值。

這個雖然不會報錯,但是很明顯,不是我們想要看到的結果。

報錯:gob: type xxx has no exported fields

我們來看一個會報錯的例子:

type Message struct { 	qq      string 	address string }  type Student struct { 	Id   uint64 `json:"id"` //可以保證json字段按照規定的字段轉義,而不是輸出 Id 	Age  uint64 `json:"age"` 	Data []Message }  func main() { 	m1 := Message{"123", "beijing"} 	m2 := Message{"456", "beijing"} 	s1 := Student{3, 19, append([]Message{}, m1, m2)}  	var buf bytes.Buffer 	enc := gob.NewEncoder(&buf) 	if err := enc.Encode(s1); err != nil { 		log.Fatal("encode error:", err) //報錯 	} 	fmt.Println(string(buf.Bytes())) }
登錄后復制

這段代碼會報錯:

2020/12/30 16:44:47 encode error:gob: type main.Message has no exported fields
登錄后復制

提醒我們注意,結構體的大小寫是很敏感的!!!

序列化方式–Binary

Binary 包實現 數字字節 序列之間的簡單轉換以及varint的編碼和解碼。

通過讀取和寫入固定大小的值來轉換數字。 固定大小的值可以是固定大小的算術類型(bool,int8,uint8,int16,float32,complex64等),也可以是僅包含固定大小值的數組或結構體。詳情可參考:https://www.php.cn/link/241200d15bc67211b50bd10815259e58binary/#Write

示例:

package main  import ( 	"bytes" 	"encoding/binary" 	"fmt" )  func main() { 	buf := new(bytes.Buffer) 	var pi int64 = 255  	err := binary.Write(buf, binary.LittleEndian, pi) 	if err != nil { 		fmt.Println("binary.Write failed:", err) 	} 	fmt.Println( buf.Bytes()) } //輸出: [255 0 0 0 0 0 0 0]
登錄后復制

這里需要注意:如果序列化的類型是 int 類型的話,將會報錯:

binary.Write failed: binary.Write: invalid type int
登錄后復制

而且,序列化的值是空的。

這是由于,他在前面已經解釋清楚了,只能序列化固定大小的類型(bool,int8,uint8,int16,float32,complex64…),或者是結構體和固定大小的數組。

其他序列化方法

當然,go語言還有其他的序列化方法,如 protobuf 協議,參考:https://geektutu.com/post/quick-go-protobuf.html

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
蜜芽亚洲日韩欧美国产高清ΑV| 韩国av一区二区三区| 国产成人欧美精品视频APP| 国产精品免费看久久久| 黑人啊灬啊灬啊灬快灬深| 久久久久人妻精品一区二区三区| 免费又大粗又爽又黄少妇毛片| 人妻丰满熟妇岳av无码区HD| 熟女无套高潮内谢吼叫免费| 西方37大但人文艺术任汾A级| 亚洲国产精品无码久久电影| 又大又硬又粗再深一点视频| JAPANESETUBE日本X| 粗大挺进尤物人妻| 国产无遮挡又黄又爽免费吃瓜视频| 精品国产第一福利网站| 妺妺坐在我腿上勃起弄了应用| 日本日本熟妇中文在线视频| 无码人妻精品一区二区三区99不卡| 亚洲精品无码寂寞少妇AV| 18禁超污无遮挡无码免费动态图 | 激情综合婷婷色五月蜜桃| 噜噜狠狠色综合久色A站网址| 人妻少妇久久精品电影| 香蕉久久夜色精品升级完成| 亚洲综合网国产精品一区| www.五月婷婷.com| 国产精品自在拍首页视频8| 久久精品国产99精品亚洲蜜桃 | 精品久久久99大香线蕉| 欧美极品另类ⅤIDEOSDE| 无码毛片AAA在线| 又爽又黄无遮挡高潮视频网站| 春色精品久久久久午夜aⅴ| 韩国羞耻漫画免费| 欧美精品黑人成人另类视频| 无码人妻视频一区二区三区| 在公交车上弄到高C了怎么办| 大乳丰满人妻中文字幕日本| 精JAVAPARSER乱偷| 人妻少妇aB又紧又爽精品视频| 性色AV一区二区三区人妻| √天堂中文最新版在线中文| 国产疯狂XXXⅩ乱大交| 乱码午夜-极品国产内射| 四虎亚洲精品成人A在线观看 | www.comAV在线观看| 国产午夜福利短视频在线观看| 内地CHINA麻豆VIDEOS| 香蕉久久夜色精品国产| AV网站免费线看精品| 红桃视频成人传媒| 日本一线和三线的区别| 亚洲熟妇无码一区二区三区导航 | 69女性XXXXⅩ丰满HD| 国产肉体XXXX裸体784大胆| 欧美精品亚洲精品日韩专区VA| 亚洲AV无码成人精品区毛片 | 人妻丰满熟妇AV无码片| 亚洲人成色777777在线观看| 大又大粗又爽又黄少妇毛片 | 国模少妇无码一区二区三区| 人妻少妇精品视频专区| 亚洲色大成网站WWW在线| 国产97在线 | 日韩| 妺妺晚上扒我内裤吃我精子| 亚洲AV成人在线播放| 拔萝卜视频免费观看高清下载| 精品人妻少妇一区| 熟妇人妻无码中文字幕老熟妇| 中文字幕不卡乱偷在线观看 | 国产AⅤ激情无码久久男男剧| 蜜芽久久人人超碰爱香蕉| 亚洲国产成人久久精品99| 粉嫩av观看成人网站| 内谢少妇XXXXX8老少交| 亚洲欧美色中文字幕在线| 国产福利一区二区久久| 欧洲人妻丰满AV无码久久不卡 | TPU色母和子色母的性能| 精品深夜av无码一区二区老年 | 亚洲一区精品人人爽人人躁| 国产精品国产三级国产AV剧情| 欧美白人最猛性XXXXX69交| 亚洲精品二区国产综合野狼| 国产成人精欧美精品视频| 人妻丰满熟妇AV无码片| 撞击成熟美妇老师后臀| 精品人体无码一区二区三区| 午夜成人鲁丝片午夜精品| 成年网站未满十八禁在线观看| 美女又大又黄WWW免费网站| 亚洲精品9999久久久久无码| 国产精品一区二区高清在线| 日产精品一线二线三线芒| 99久久精品国产一区二区蜜芽| 久久精品国产99久久久小说| 亚洲AV无码成人影片在线观看| 国产成人AV一区二区三区| 人人妻人人澡人人爽精品日本 | 你的奶好大让老子摸摸的说说| 亚洲中文字幕乱码电影| 狠狠狠的在啪线香蕉WWW、WL| 无码A∨高潮抽搐流白浆8MAV| 粗大抽搐白浊H高干H| 秋霞午夜成人久久电影网| 2021国内精品久久久久精品K| 久久人人做人人妻人人玩精品VA| 亚洲国产一区二区三区在线观看| 国产偷国产偷精品高清尤物 | 艳妇乳肉豪妇荡乳ⅩXXOO小说| 火车上荫蒂添的好舒服视频| 性无码免费一区二区三区在线| 国产盗摄XXXX视频XXXX| 少妇私密会所按摩到高潮呻吟 | 少妇久久久被弄到高潮| 超级YIN荡的公司聚会| 秋霞无码AⅤ一区二区三区| AAA女人18毛片水真多| 男友把舌头都伸进我的嘴巴里了| 中文字幕精品一二三四五六七八| 老肥熟妇丰满大屁股在线播放| 亚洲一线产区二线产区区别在| 精东天美麻豆果冻传媒MV| 亚洲国产精品久久人人爱| 狠狠躁天天躁男人| 亚洲国产成人精品无码区在线播放 | 92国产精品午夜福利免费| 男人做一次爱能舒服多久| 69综合精品国产二区无码 | 50岁老熟人乱一区二区三区| 免费观看男女AV入口网站| 自拍亚洲欧美在线成电影| 男女爽爽午夜18禁影院免费| 99热门精品一区二区三区无码| 欧美乱大交XXXXX| 把腿张开老子cao烂你在线视频 | 久久婷婷人人澡人人爽人人喊| 一区蜜桃中文不卡在线| 麻豆AV一区二区三区| 52综合精品国产二区无码| 秋霞午夜久久午夜精品| 丁香五月婷婷色人阁TP精品| 天堂资源とまりせっくす| 国产熟妇一区二区三区AⅤ在线 | 精品人妻系列无码人妻在线不| 亚洲无线一二三四区手机| 麻豆╳╳╳乱女另类| CHINESE国产老熟女| 日本一区二区在线播放| 国产精品VIDEOSSEX久久发布| 亚洲AⅤ秘区二区三区4| 九九电影网午夜理论片| 月光影院在线观看免费直播| 女教师の爆乳BD在线观看| 产精品无码久久_亚洲国产精| 熟女性饥渴一区二区三区| 国产一区二区怡红院| 亚洲日韩在线中文字幕综合| 麻豆成人传媒一区二区| XXXXXHD亚洲日本HD| 熟女丝袜香蕉双人女高潮| 国内精品一线二线三线黄| 亚洲中文字幕波多野结衣| 女强人被春药精油按摩4| 够了够了到高C了| 色婷婷久久久SWAG精品| 国产精品无码一本二本三本色| 我的好妈妈中文字幕HD| 护士扒下内裤让我爽一夜| 亚洲国产精品久久久久蜜桃噜噜| 月光影视WWW在线观看| 性色AV蜜臀AV色欲AV| 无码AV专区丝袜专区| 人妻少妇精品专区性色AV| 国产精品无码久久综合网| 西方37大但人文艺术A管77| 国产未成女YOUNV仙踪林| 亚洲精品9999久久久久无码| 巨胸爆乳美女露双奶头挤奶| 7777奇米四色成人眼影| 日本COSME大赏美白| 国产成人综合久久精品免费| 亚洲国产精品无码AV| 麻豆影视视频高清在线观看| SUNTEK中老年妈妈| 色偷偷色噜噜狠狠成人免费视频| 国产精品你懂的在线播放| 亚洲国产精品无码一区二区三区| 久久亚洲精品中文字幕波多野结衣 | 色情ⅩXXX欧美色妇HD| 国产精品自产拍在线观看| 亚洲日本乱人伦片中文| 女教师娇喘潮喷抽搐在线视频| 各种少妇BBW撒尿| 亚洲AV永久无码精品无码少妇 | 被黑人猛男强伦姧人妻完整版| CAOPOREN个人免费公开| 欧美精品V国产精品V日韩精品| 欧美午夜成人片在线观看|