基于云风的sproto二进制标准上的描述文件及代码生成工具
English Doc see below: https://github.com/davyxu/gosproto/blob/master/README_en.md
https://github.com/xjdrew/gosproto
Google Protobuf是一个用途非常广泛的数据传输格式及标准,几乎支持所有地球上的编程语言. Protobuf 3.0版本的很多设计也是非常优秀的.但是和C++多年发展类似的,Protobuf承载了太多的历史包袱. 除了格式复杂,到描述文件,插件体系的设计都不能满足一些性能领域或者特殊领域的特别要求.
使用Unity配合Lua制作游戏的团队中,很多也使用Protobuf.但是Protobuf的二进制复杂格式在Lua层上造成了很大的GC和性能问题. 云风自己的pbc也不能完全与官方Protobuf二进制兼容.
同为云风出品的sproto格式设计精巧.以简单性能为第一需求,天生就为lua做特殊优化,无需担心性能问题. 本库(gosproto)以及配套的代码生成工具(sprotogen)也正是基于云风的sproto二进制层基础上构建的一整套工具链.
-
兼容云风版sproto格式,并扩充的格式,比Protobuf更方便, 更快
-
代码生成输出支持go,c#,lua以及云风原版sproto
下面是sprotogen支持的推荐格式
enum Vocation {
Monkey
Monk
Pig
}
message PhoneNumber {
number string
type int32
}
message Person {
name string
id int32
email string
phone PhoneNumber
voc Vocation
}
message AddressBook {
person []Person
}
-
自动生成tag序列号(base0,sproto规范),也可以手动指定
-
自动生成枚举序号(base0),也可以手动指定
-
类go结构体字段命名方式
-
比Protobuf更方便的导出注释内容做协议扩充
解析器可以同时兼容两种格式书写,可以在任何地方混合书写. 更推荐使用sp格式,有更强的扩展和兼容性
.PhoneNumber {
number 0 : string
type 1 : integer
}
.Person {
name 0 : string
id 1 : integer
email 2 : string
phone 3 : *PhoneNumber
}
.AddressBook {
person 0 : *Person
}
input := &AddressBook{
Person: []*Person{
&Person{
Name: "Alice",
Id: 10000,
Phone: []*PhoneNumber{
&PhoneNumber{
Number: "123456789",
Type: 1,
},
&PhoneNumber{
Number: "87654321",
Type: 2,
},
},
},
&Person{
Name: "Bob",
Id: 20000,
Phone: []*PhoneNumber{
&PhoneNumber{
Number: "01234567890",
Type: 3,
},
},
},
},
}
data, err := sproto.Encode(input)
if err != nil {
t.Log(err)
}
var sample AddressBook
_, err = sproto.Decode(data, &sample)
if err != nil {
t.Log(err)
}
- int32: 32位整形
- int64: 64位整形
- uint32: 无符号32位整形
- uint64: 无符号64位整形
- string: 字符串
- float32: 单精度浮点数(默认精度0.001)
- float64: 双精度浮点数(默认精度0.001)
- bytes: 二进制数据
- enum: int32封装
- bool: 布尔
- message 结构体
所有类型前添加[]表示数组
go get -u -v github.com/davyxu/gosproto/sprotogen
https://github.com/davyxu/gosproto/releases
-
go_out 输出Go源码
-
lua_out 输出lua源码,兼容云风版本
-
cs_out 输出C#源码, 配套基类库请参考https://github.com/davyxu/sproto-Csharp
-
sproto_out 输出云风版sproto的描述文件
-
package 包或者命名空间名
-
cellnet_reg 在Go的生成代码中添加cellnet自动注册入口
# 输出go源码
sprotogen --go_out=addressbook.go --package=example addressbook.sp
# 生成C#源码
sprotogen --cs_out=addressbook.cs --package=example addressbook.sp
https://github.com/davyxu/gosproto/tree/master/example
https://github.com/davyxu/gosproto/tree/master/pb2sproto
保留所有protobuf的注释
go get -u -v github.com/davyxu/gosproto/pb2sproto
第三方库依赖: github.com/davyxu/pbmeta
# 使用Protobuf编译器:protoc配合插件github.com/davyxu/pbmeta/protoc-gen-meta 生成pb的上下文信息
# 参见: github.com/davyxu/gosproto/pb2sproto/Make.bat
# 根据上下文信息导出sproto
pb2sproto --pbmeta=meta.pb --outdir=.
感觉不错请star, 谢谢!