zoukankan      html  css  js  c++  java
  • 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)
    }

     

  • 相关阅读:
    SQLite数据库如何存储和读取二进制数据
    JS常用代码
    获取内容第一张图片地址的函数
    我对App_Code的理解
    VS2008中Web项目的App_Code目录问题
    jQuery 浮动广告实现代码
    常用的倒计时脚本
    IE8 CSS hack
    精典的网吧常用批处理收集
    ASP.NET中App_Code,App_Data等文件夹的作用
  • 原文地址:https://www.cnblogs.com/yinzhengjie2020/p/12735277.html
Copyright © 2011-2022 走看看