跳到主要内容

protoex

简介

protobuf 接口插件,依赖FFI实现

提供序列化和反序列化接口

使用方法

object ob := protoex.new_one();
ob.load(file.get_os_path_from_script_path("/test/proto/"), "test.proto");
mixed data = {"id" : 10, "name" : "aaa"};
// 序列化
string buf = ob.pack("test", data);

// 反序列化
mixed ret = ob.unpack("test", buf);

使用优势

  1. 包体小,protobuf由于提供了描述符文件,定义了每个变量的数据类型,包体可以压缩的很小
  2. 静态编译,序列化反序列化高效

性能对比

ps

均采用动态序列化的方式进行测试

类型序列化开销反序列化开销总开销包体大小
Protobuf177(ms)126(ms)303(ms)37 Bytes
Msgpack79(ms)183(ms)262(ms)62 Bytes
说明
  • msgpack的序列化速度比protobuf要快一些,但反序列化要比protobuf要慢一些,但总体都接近
  • msgpack可以直接序列化类对象,但protobuf需要先写描述映射文件(.proto)
  • msgpack支持的基本类型比protobuf支持的要全面些
  • msgpack的包体要比protobuf大很多

使用结论

  1. 如果追求极致性能,并且节省流量,建议使用protobuf静态编译的方式
  2. 如果追求开发的方便性,建议使用msgpack,自由度高,性能也很优越,包体稍大

组件接口

protoex.gs

函数原型函数作用
object new_one()创建一个protobuf实例对象

protoex_impl.gs

函数原型函数作用
void load(string filepath, string filename)加载文件路径
void freedata(int ptr)释放message指针
string pack(string descname, mixed content)序列化
mixed unpack(string descname, string scode)反序列化
int new_msg(string descname)创建一个message对象
void set_int32(int buffer, string descname, string fieldname, int val)设置一个int32类型的参数
void set_uint32(int buffer, string descname, string fieldname, int val)设置一个uint32类型的参数
void set_int64(int buffer, string descname, string fieldname, int val)设置一个int64类型的参数
void set_uint64(int buffer, string descname, string fieldname, int val)设置一个uint64类型的参数
void set_string(int buffer, string descname, string fieldname, string val)设置一个string类型的参数
void set_float(int buffer, string descname, string fieldname, float val)设置一个float类型的参数
void set_double(int buffer, string descname, string fieldname, float val)设置一个double类型的参数
int get_mutable_msg(int buffer, string descname, string fieldname)获取一个结构体参数
void add_int32(int buffer, string descname, string fieldname, int val)添加一个int32类型参数
void add_uint32(int buffer, string descname, string fieldname, int val)添加一个uint32类型参数
void add_int64(int buffer, string descname, string fieldname, int val)添加一个int64类型参数
void add_uint64(int buffer, string descname, string fieldname, int val)添加一个uint64类型参数
void add_string(int buffer, string descname, string fieldname, string val)添加一个string类型参数
void add_float(int buffer, string descname, string fieldname, float val)添加一个float类型参数
void add_double(int buffer, string descname, string fieldname, float val)添加一个double类型参数
int add_mutable_msg(int buffer, string descname, string fieldname)添加一个结构体参数
string serialize_to_string(int buffer)序列化到字符串
int parse_from_string(int buffer, string scode)从字节种反序列化
int get_int32(int buffer, string descname, string fieldname)获取一个int32类型参数
int get_uint32(int buffer, string descname, string fieldname)获取一个uint32类型参数
int get_uint64(int buffer, string descname, string fieldname)获取一个uint64类型参数
string get_string(int buffer, string descname, string fieldname)获取一个string类型参数
float get_float(int buffer, string descname, string fieldname)获取一个float类型参数
float get_double(int buffer, string descname, string fieldname)获取一个double类型参数
int get_mutable_int32(int buffer, string descname, string attachname, string fieldname, string atfiledname)获取一个结构体中的int32类型参数
int get_mutable_uint32(int buffer, string descname, string attachname, string fieldname, string atfiledname)获取一个结构体中的uint32类型参数
int get_mutable_int64(int buffer, string descname, string attachname, string fieldname, string atfiledname)获取一个结构体中的int64类型参数
int get_mutable_uint64(int buffer, string descname, string attachname, string fieldname, string atfiledname)获取一个结构体中的uint64类型参数
string get_mutable_string(int buffer, string descname, string attachname, string fieldname, string atfiledname)获取一个结构体中的string类型参数
float get_mutable_float(int buffer, string descname, string attachname, string fieldname, string atfiledname)获取一个结构体中的float类型参数
float get_mutable_double(int buffer, string descname, string attachname, string fieldname, string atfiledname)获取一个结构体中的double类型参数
int get_field_size(int buffer, string descname, string fieldname)获取字段长度
int get_repeated_int32(int buffer, string descname, string fieldname, int size, int index)获取一个数组中int32类型的参数
int get_repeated_uint32(int buffer, string descname, string fieldname, int size, int index)获取一个数组中uint32类型的参数
int get_repeated_int64(int buffer, string descname, string fieldname, int size, int index)获取一个数组中int64类型的参数
int get_repeated_uint64(int buffer, string descname, string fieldname, int size, int index)获取一个数组中uint64类型的参数
string get_repeated_string(int buffer, string descname, string fieldname, int size, int index)获取一个数组中string类型的参数
float get_repeated_float(int buffer, string descname, string fieldname, int size, int index)获取一个数组中float类型的参数
float get_repeated_double(int buffer, string descname, string fieldname, int size, int index)获取一个数组中double类型的参数
int get_repeated_mutable_int32(int buffer, string descname, string attachname, string fieldname, string atfiledname, int size, int index)获取一个结构体数组中int32类型的参数
int get_repeated_mutable_uint32(int buffer, string descname, string attachname, string fieldname, string atfiledname, int size, int index)获取一个结构体数组中uint32类型的参数
int get_repeated_mutable_int64(int buffer, string descname, string attachname, string fieldname, string atfiledname, int size, int index)获取一个结构体数组中int64类型的参数
int get_repeated_mutable_uint64(int buffer, string descname, string attachname, string fieldname, string atfiledname, int size, int index)获取一个结构体数组中uint64类型的参数
string get_repeated_mutable_string(int buffer, string descname, string attachname, string fieldname, string atfiledname, int size, int index)获取一个结构体数组中string类型的参数
float get_repeated_mutable_float(int buffer, string descname, string attachname, string fieldname, string atfiledname, int size, int index)获取一个结构体数组中float类型的参数
float get_repeated_mutable_double(int buffer, string descname, string attachname, string fieldname, string atfiledname, int size, int index)获取一个结构体数组中double类型的参数
string encode(map scode)序列化一个map
map decode(string sdata, map scode)反序列化二进制数据