Golang的序列化-Gob篇
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
和Python的pickle模塊類似,Go語言自帶的序列化方式就是gob,一些go語言自帶的包使用的序列化方式都是gob。接下來我們就來查看一下Gob的使用方式。
一.gob序列化案例
package main import ( "bytes" "encoding/gob" "fmt" ) type People struct { Name string Age int } func main() { p := People{ Name: "Jason Yin", Age: 18, } /** 定義一個字節容器,其結構體如下所示: 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. } */ buf := bytes.Buffer{} /** 初始化編碼器,其函數簽名如下: func NewEncoder(w io.Writer) *Encoder 以下是函數簽名的參數說明: w: 一個io.Writer對象,我們可以傳遞"bytes.Buffer{}"的引用地址 返回值: NewEncoder返回將在io.Writer上傳輸的新編碼器。 */ encoder := gob.NewEncoder(&buf) /** 編碼操作 */ err := encoder.Encode(p) if err != nil { fmt.Println("編碼失敗,錯誤原因: ", err) return } /** 查看編碼后的數據(gob序列化其實是二進制數據喲~) */ fmt.Println(string(buf.Bytes())) }
二.gob反序列化案例
package main import ( "bytes" "encoding/gob" "fmt" ) type Student struct { Name string Age int } func main() { s1 := Student{ Name: "Jason Yin", Age: 18, } buf := bytes.Buffer{} /** 初始化編碼器 */ encoder := gob.NewEncoder(&buf) /** 編碼操作,相當於序列化過程喲~ */ err := encoder.Encode(s1) if err != nil { fmt.Println("編碼失敗,錯誤原因: ", err) return } /** 查看編碼后的數據(gob序列化其實是二進制數據喲~) */ //fmt.Println(string(buf.Bytes())) /** 初始化解碼器,其函數簽名如下: func NewDecoder(r io.Reader) *Decoder 以下是函數簽名的參數說明: r: 一個io.Reader對象,其函數簽名如下所示: func NewReader(b []byte) *Reader 綜上所述,我們可以將編碼后的字節數組傳遞給該解碼器 返回值: new decoder返回從io.Reader讀取的新解碼器。 如果r不同時實現io.ByteReader,它將被包裝在bufio.Reader中。 */ decoder := gob.NewDecoder(bytes.NewReader(buf.Bytes())) var s2 Student fmt.Println("解碼之前s2 = ", s2) /** 進行解碼操作,相當於反序列化過程喲~ */ decoder.Decode(&s2) fmt.Println("解碼之前s2 = ", s2) }