Golang的序列化-Gob篇


            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)
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM