1.序列化

当交易通过网络传输或在应用程序之间交换时,它们被序列化。 序列化是将内部的数据结构表示转换为可以一次发送一个字节的格式(也称为字节流)的过程。 序列化最常用于编码通过网络传输或用于文件中存储的数据结构。

2.反序列化

从交易的字节流表示转换为函数库的内部数据结构表示的过程称为反序列化或交易解析。转换回字节流以通过网络传输、哈希化(hashing)或存储在磁盘上的过程称为序列化。大多数比特币函数库具有用于交易序列化和反序列化的内置函数。

3.gob包介绍

binary.Write(), binary.Read()

gob是Golang包自带的一个数据结构序列化的编码/解码工具。编码使用Encoder,解码使用Decoder。一种典型的应用场景就是RPC(remote procedure calls)。

gob和json的pack之类的方法一样,由发送端使用Encoder对数据结构进行编码。在接收端收到消息之后,接收端使用Decoder将序列化的数据变化成本地变量。

4.demo演示

  • 定义一个结构Person
  • 使用gob进行序列化(编码)得到字节流
  • 使用gob进行反序列化(解码)得到Person结构
  • 记住,这里所有的结构都用地址传递即可
package main

import (
    "encoding/gob"
    "bytes"
    "fmt"
)

type Person struct {
    //大写
    Name string
    Age int
}

func main()  {
    var buffer bytes.Buffer
    encoder := gob.NewEncoder(&buffer)

    lily := Person{ "Lily", 28}

    err := encoder.Encode(&lily)
    if err != nil {
        fmt.Println("encode failed!", err)
    }

    fmt.Println("after serialize :", buffer)
    var LILY Person

    decoder := gob.NewDecoder(&buffer)
    err = decoder.Decode(&LILY)
    if err != nil {
        fmt.Println("decode failed!", err)
    }

    fmt.Println(LILY)
}

5.Serialize函数

/序列化:将结构转化成字节流,在网络上按字节传输。
func (block *Block)Serialize() []byte {
    //将block数据转换成字节流

    var buffer bytes.Buffer
    //创建一个编码器
    encoder := gob.NewEncoder(&buffer)

    //编码,将block编码成buffer
    err := encoder.Encode(block)

    if err != nil {
        fmt.Println("encode failed!", err)
        os.Exit(1)
    }

    return buffer.Bytes()
}

6.Deserialize函数

// 反序列化:将接受到的字节流转换成目标结构。
func Deserialize(data []byte) Block {
    var block Block
    var buffer bytes.Buffer

    //将data写入buffer
    _, err := buffer.Write(data)
    if err != nil {
        fmt.Println("buffer.Read failed!", err)
        os.Exit(1)
    }

    //创建decoder
    decoder := gob.NewDecoder(&buffer)

    //将buffer数据转换成block
    err = decoder.Decode(&block)
    if err != nil {
        fmt.Println("decode failed!", err)
        os.Exit(1)
    }

    return block
}