目录

 为什么要序列化和反序列化

 Json简介和使用

 Msgpack简介和使用

 Protobuf简介和使用

为什么需要序列化和反序列化?

微服务特点

           1.每个服务专注做好一件事

           2.微服务之间需要进行交互

           3.每个服务可以使用任何语言进行开发

为什么需要序列化和反序列化?

服务之间进行沟通(交互)的媒介

序列化和反序列化,充当翻译官的角色

 翻译官的特点

            支持目前绝大多数的语言

           翻译的又快又准(性能好)

           空间开销小(节约带宽)

常见数据格式对比

Json数据格式介绍和使用

优点

           文本格式,易读性较好

           简单易用,开发成本低

缺点

           序列化后的体积比较大,影响并发

           序列化性能低

Json数据格式介绍和使用

对象

 

数组

value

字符串

 

数字

 

坑爹的地方

           Json中数字是使用double进行存储,最大值只支持,2~53-1。

           如果程序使用int64或uint64,可能存在溢出的风险。

           这种情况下,只用string来传递

简单使用:

           导入 encoding/json

           json.Marshal

           json.Unmarshal

tag使用

           定制json中的key名字

           指定数据类型, string,number,boolean

           忽略空值,omitempty

           忽略字段,-

自定义Marshal和Unmarshal

           灵活方便

           自定义时间类型

MsgPack介绍和使用

Json的二进制版本

           空间占用小

           序列化和反序列化性能高

 导入:"github.com/vmihailenco/msgpack“

           调用msgpack.Marshal进行序列化

           调用msgpack.Unmarshal进行反序列化

type Person struct{
    Name string
    Age int
    Sex string
}
func writeJson(filename string)(err error){
    var persons []*Person
    for i := 0 ; i < 10; i++ {
        p := &Person{
                Name:fmt.Sprintf("name%d",i).
                Age:rand.Intn(100),
                Sex:"Man",
            }
        person = append(person,p)
    }
    data,err := msgpack.Marshal(persons)
    if err != nil {
        fmt.Printf("=marshal failed err:%v n",err)
        return
    }
    err = ioutil.WriteFile(filename,data,0755)
    if err != nil{
        fmt.Printf("Write file failed,err:%v n",err)
        return
    }
}

func readJson(filename string)(err error){
    var person []*Person
    data,err := ioutil.ReadFile(filename)
    if err!=nil {
        return
    }
    err = msgpack.Unmarshal(data,&persons)        
}

使用代码自动生成

           go get github.com/tinylib/msgp

           通过 go:generate msgp指定生成msgpack 序列化的代码

Protobuf介绍和使用

Google推出的序列化协议

           1.灵活的、高效的、自动化的用于对结构化数据进行序列化的协议

           2.二进制

           3.基于IDL(接口描述语言)的自动化代码生成

protobuf开发流程

           1.IDL编写

           2.生成指定语言的代码

           3.序列化和反序列化

枚举定义

enum EnumAllowingAlias {
    UNKNOWN = 0;
    STARTED = 1;
    RUNNING = 2;
}

结构体定义

message Person {
    //后面的数字表示标识号
    int32 id = 1;
    string name = 2;
    //repeated表示可重复
    //可以有多个手机
    repeated Phone phones = 3;
}

工具安装

           1.安装protoc编译器,解压后拷贝到GOPATH/bin目录下

           2.https://github.com/google/protobuf/releases

           3.安装golang代码插件, go get -u github.com/golang/protobuf/protoc-gen-go

代码生成

           1.生成代码, protoc --go_out=. xxx.proto

使用

           1.导入 github.com/golang/protobuf/proto

           2.proto.Marshal序列化

           3.proto.Unmarshal反序列化