目录
为什么要序列化和反序列化
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反序列化