LiteByte教程
简介
litebyte是一种轻量级的二进制数据交换格式。
体积小巧、简单易用是设计目标。主要用于解决前后台数据传输量的问题。
作者:冰封百度(zhangyu)
设计的灵感来源于c# struct内存对齐后的紧凑格式。暂时只实现了c#版本。
特点
1.紧凑的二进制数据格式,支持变长整型,数据量小。
2.用近似代码定义类的方式定义对象结构,使用方便。
实现思路
把一个对象分为两个部分:结构和值,结构用配置文件定义,值用于网络传输。前后台依赖相同的结构配置文件,转换时把对象的值拆出来传输,解析时把值还原成对象。
使用方法
1.创建自定义结构文件customtype.lbs (litebyte schema 文本文件)。
2.定义对象字段(像写类一样写结构、类型和名称)。
3.调用lbutil.serialize(object) 把对象序列化成二进制数据。
4.调用lbutil.deserilize(bytes) 把二进制数据反序列化成对象。
代码样例:
// 自定义对象结构: // 写结构配置和c#中写struct一样, 访问修饰符可以不写,读配置文件的时候会被忽略 /// <summary> 玩家信息测试 | playerinfo test </summary> public struct playerinfo { public uint id; public string nickname; public byte gender; public bool isvip; public int lv; public int hp; public int mp; public int exp; } // 命名空间 using litebyte; // 创建对象 playerinfo player = new playerinfo(); player.id = 100001; player.nickname = "冰封百度"; player.gender = 1; player.isvip = true; player.lv = 999; player.hp = 999999; player.mp = 999999; player.exp = 9999999; // 序列化: string typename = "playerinfo"; byte[] bytes = lbutil.serialize(typename, player); // 长度:31字节 // 反序列化: playerinfo info = lbutil.deserialize<playerinfo>(typename, bytes);
转换结果:
代码说明:
1.序列化对象时用lbutil.serialize("name", obj)
2.反序列化对象时候用lbutil.deserilize("name", obj)
3.可以转换自定义的struct和class 字段需要是public的
4.提供了通用的转换对象lbobject,可以set和get值,用于动态创建全新的自定义结构。由于序列化和反序列化自定义struct和class时用了反射,效率不高,用lbobject转换效率会更高一些,但用起来会麻烦一些,按自己喜欢的方式使用就好。
支持的数据类型
数据类型介绍
1.基本的值类型:bool、byte、short、int、long
2.字符串 string (支持utf8、unicode、ascii三种编码方式)
3.数组 (类型+"[]"会被识别成数组)
4.自定义类型 (复杂对象)
基本数据类型
比特型(7种)
类型 | 长度 | 值范围 |
bit1(boolean) | 1位 | 0 ~ 1 |
bit2(byte) | 2位 | 0 ~ 3 |
bit3(byte) | 3位 | 0 ~ 7 |
bit4(byte) | 4位 | 0 ~ 15 |
bit5(byte) | 5位 | 0 ~ 31 |
bit6(byte) | 6位 | 0 ~ 63 |
bit7(byte) | 7位 | 0 ~ 127 |
整型(16种)
类型 | 长度 | 值范围 |
int8(sbyte) | 1字节 | -128 ~ 127 |
int16(short) | 2字节 | -32768 ~ -32767 |
int24(int) | 3字节 | -8388608 ~ 8388607 |
int32(int) | 4字节 | -2147483648 ~ 2147483647 |
int40(long) | 5字节 | -549755813888 ~ 549755813887 |
int40(long) | 6字节 | -140737488355328 ~ 140737488355327 |
int40(long) | 7字节 | -36028797018963968 ~ 36028797018963967 |
int64(long) | 8字节 | -9223372036854775808 ~ 9223372036854775807 |
uint8(byte) | 1字节 | 0 ~ 255 |
uint16(ushort) | 1字节 | 0 ~ 65535 |
uint24(uint) | 1字节 | 0 ~ 16777215 |
uint32(uint) | 1字节 | 0 ~ 4294967295 |
uint40(ulong) | 1字节 | 0 ~ 1099511627775 |
uint48(ulong) | 1字节 | 0 ~ 281474976710655 |
uint56(ulong) | 1字节 | 0 ~ 72057594037927935 |
uint64(ulong) | 1字节 | 0 ~ 18446744073709551615 |
浮点型(5种)
类型 | 长度 | 有效数字 | 值范围 |
float8(float) | 1字节 | 7位 | 0/255 ~ 255/255 |
float16(float) | 2字节 | 3位 | ±6.55e +4 |
float24(float) | 3字节 | 5位 | ±1.8447e +19 |
float32(float) | 4字节 | 7位 | ±3.402823e +38 |
float64(double) | 8字节 | 15位 | ±1.7976931348623157e +308 |
变长整型(7种)
类型 | 长度 | 值范围 |
varint16(short) | 1位 + 1~2字节 | 同int16 |
varint32(int) | 2位 + 1~4字节 | 同int32 |
varint64(long) | 3位 + 1~8字节 | 同int64 |
varuint16(ushort) | 1位 + 1~2字节 | 同uint16 |
varuint32(uint) | 2位 + 1~4字节 | 同uint32 |
varuint64(ulong) | 3位 + 1~8字节 | 同uint64 |
varlength(int) | 3位 + 1~8字节 | -1 ~ (int32.maxvalue/2 - 1) |
字符串(3种编码)
类型 | 单个字符长度 | 总长度范围 |
utf8(string) | 1~4字节 | 头(1~4)字节+体(0 ~ 1073741822)字节 |
unicode(string) | 2字节 | 头(1~4)字节+体(0 ~ 1073741822)x2字节 |
ascii(string) | 1字节 | 头(1~4)字节+体(0 ~ 1073741822)字节 |
复杂数据类型(2种)
类型 | 表达式 |
数组(array) | 类型名称[] |
字典(未实现) | dictionary<基本类型, 类型名称> |
自定义类型 | 只要不和基本类型和数组重名 即被当作自定义类型 |
自定义类型结构配置(litebyte schema)样例
以下样例中 基本类型默认应用以下简称配置
bit1 = bool
int8 = sbyte
uint8 = byte
varint32 = int
varunt32 = uint
varint64 = long
varuint64 = ulong
utf8 = string
基本数据类型 结构:
1 struct basetypest { 2 3 // 比特型 4 bool boolvalue; 5 6 // 有符号整型 7 sbyte sbytevalue; 8 short shortvalue; 9 int intvalue; 10 long longvalue; 11 12 // 无符号整型 13 byte bytevalue; 14 ushort ushortvalue; 15 uint uintvalue; 16 ulong ulongvalue; 17 18 // 有符号浮点型 19 float floatvalue; 20 double doublevalue; 21 22 // 字符型(utf8) 23 string stringvalue; 24 25 }
数组 结构:
1 struct arrayst { 2 int[] ids; 3 string[] names; 4 }
用户信息 结构:
1 struct userinfost { 2 3 uint id; 4 string username; 5 string nickname; 6 int hp; 7 int mp; 8 long exp; 9 long gold; 10 byte age; 11 bool isvip; 12 13 }
各语言类型对照表
类型 | 长度 | c# | java | c++ | go |
bit1 | 1位 | bool | boolean | char | bool |
bit2 | 2位 | byte | byte | char | uint8 |
bit3 | 3位 | byte | byte | char | uint8 |
bit4 | 4位 | byte | byte | char | uint8 |
bit5 | 5位 | byte | byte | char | uint8 |
bit6 | 6位 | byte | byte | char | uint8 |
bit7 | 7位 | byte | byte | char | uint8 |
int8 | 1字节 | sbyte | sbyte | char | int8 |
int16 | 2字节 | short | short | short | int16 |
int24 | 3字节 | int | int | int | int32 |
int32 | 4字节 | int | int | int | int32 |
int40 | 5字节 | long | long | long long | int64 |
int48 | 6字节 | long | long | long long | int64 |
int56 | 7字节 | long | long | long long | int64 |
int64 | 8字节 | long | long | long long | int64 |
uint8 | 1字节 | byte | byte | unsigned char | uint8 |
uint16 | 2字节 | ushort | ushort | unsigned short | uint16 |
uint24 | 3字节 | uint | uint | unsigned int | uint32 |
uint32 | 4字节 | uint | uint | unsigned int | uint32 |
uint40 | 5字节 | ulong | ulong | unsigned long long | uint64 |
uint48 | 6字节 | ulong | ulong | unsigned long long | uint64 |
uint56 | 7字节 | ulong | ulong | unsigned long long | uint64 |
uint64 | 8字节 | ulong | ulong | unsigned long long | uint64 |
float8 | 1字节 | float | float | float | float32 |
float16 | 2字节 | float | float | float | float32 |
float24 | 3字节 | float | float | float | float32 |
float32 | 4字节 | float | float | float | float32 |
float64 | 8字节 | double | double | double | float64 |
varint16 | 1位+1~2字节 | short | short | short | int16 |
varint32 | 2位+1~4字节 | int | int | int | int32 |
varint64 | 3位+1~8字节 | long | long | long long | int64 |
varuint16 | 1位+1~2字节 | ushort | ushort | unsigned short | uint16 |
varuint32 | 2位+1~4字节 | uint | uint | unsigned int | uint32 |
varuint64 | 3位+1~8字节 | ulong | ulong | unsigned long long | uint64 |
varlength | 2位+1~4字节 | int | int | int | int32 |
utf8 | 1~4字节 | string | string | string | string |
unicode | 2字节 | string | string | string | string |
ascii | 1字节 | string | string | string | string |
共计38种
数据类型说明:
1.对bool型的支持最好,一个bool型只占1位(1/8个字节)。
2.支持变长整数(short、int、long、ushort、uint、ulong)
3.支持null值 (能空的类型string, array, object,都支持它们为空的情况)
4.建议在定义数据格式时,用尽量小的类型定义字段,这样序列化的数据体积会更小,如果懒得写,可以考虑使用变长数据。
5.支持自定义数据类型名称,因为相同的数据类型在不同的编程语言中名字不一样,为了方便使用,我添加了一套内置数据类型名称并添加了一个类型名称映射的功能,可以自定义基本值类型的名称,按照自己喜欢的风格命名就好。
6.因为在编写变长数据类型的过程中用到了一些不常见的数据格式,为了重用类型,索性就一起支持了,在对数据大小很严格的环境会有帮助,这些非常规的数据类型有:
bit2~bit7 占2~7位
int24、int40、int48、int56 占3、5、6、7字节
uint24、uint40、uint48、uint56 占3、5、6、7字节
varlength 用于表示string和array的长度 值范围-1~(int.maxvalue/2 - 1)
其他说明:
由于能力有限,暂时只实现了c#版本(在unity中实现的,算半个.net吧)
其他语言后续有时间再写,虽然造了个* 不过感觉造*的过程中收获远大于付出,挺开心的。
建了个群,有需求的可加。
qq群:715800513
项目github:
测试demo:
链接:https://pan.baidu.com/s/1yqvn6f4yaknbdnd0g86xow
提取码:lio4
转载请标明原文地址:
上一篇: 买个衣服还想免费看片
下一篇: Servlet运行原理
推荐阅读
-
13、ABPZero系列教程之拼多多卖家工具 微信公众号开发前的准备
-
php使用mysql_query查询超大结果集超内存的解决方法,phpmysql_query_PHP教程
-
【C++深度剖析教程15】经典问题解析之关于string的疑问
-
手把手教你做关键词匹配项目(搜索引擎)---- 第十五天,教你做----_PHP教程
-
php 获取全局变量的简单代码_PHP教程
-
用PHP实现POP3邮件的收取三_PHP教程
-
为ckeditor编辑器修改添加一键排版功能_PHP教程
-
php disk_free_space与disk_total_space 函数_PHP教程
-
PHP删除数组元素与删除重复数组函数_PHP教程
-
【c#教程】C# 泛型(Generic)