简介

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 = ;
player.nickname = "冰封百度";
player.gender = ;
player.isVip = true;
player.lv = ;
player.hp = ;
player.mp = ;
player.exp = ; // 序列化:
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

基本数据类型 结构:

 struct BaseTypeST {

     // 比特型
bool boolValue; // 有符号整型
sbyte sbyteValue;
short shortValue;
int intValue;
long longValue; // 无符号整型
byte byteValue;
ushort ushortValue;
uint uintValue;
ulong ulongValue; // 有符号浮点型
float floatValue;
double doubleValue; // 字符型(UTF8)
string stringValue; }

数组 结构:

 struct ArrayST {
int[] ids;
string[] names;
}

用户信息 结构:

 struct UserInfoST {

     uint id;
string username;
string nickname;
int hp;
int mp;
long exp;
long gold;
byte age;
bool isVip; }

各语言类型对照表

类型 长度 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:https://github.com/zhangyukof/litebyte

测试Demo:
链接:https://pan.baidu.com/s/1yQVn6f4YAkNBDnD0g86xow
提取码:lio4

转载请标明原文地址:https://www.cnblogs.com/zhangyukof/p/12073041.html

LiteByte教程的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  3. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  4. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  5. Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境

    一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...

  6. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  7. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  8. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  9. Virtual Box配置CentOS7网络(图文教程)

    之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...

随机推荐

  1. [UWP]用Win2D和CompositionAPI实现文字的发光效果,并制作动画

    1. 成果 献祭了周末的晚上,成功召唤出了上面的番茄钟.正当我在感慨"不愧是Shadow大人,这难道就是传说中的五彩斑斓的黑?" "那才不是什么阴影效果,那是发光效果.& ...

  2. PostGIS 结合Openlayers以及Geoserver实现最短路径分析(一)

    环境: Win10 ArcMap10.4(用于数据处理) postgresql9.4 postgis2.2.3 pgRouting2.3(postgresql插件) ##附上本文配套素材下载地址:ht ...

  3. ArcGIS 问题汇总

    1.Arcgis10.4出现Manager打不开的情况 解决方法: 1.检查进程中是否有占用4000以及6080端口的进程,如果有关闭 2.检查进程中是否有javaw.exe这个进程,如果有就把他结束 ...

  4. 学会这8个优秀 Python 库用于业余项目,将大大减少程序员耗费的精力

    在数据库中即时保存数据:Dataset 当我们想要在不知道最终数据库表长什么样的情况下,快速收集数据并保存到数据库中的时候,Dataset 库将是我们的最佳选择.Dataset 库有一个简单但功能强大 ...

  5. python3 之 迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束. 迭代器只能往前不会后 ...

  6. pandas dataframe重复数据查看.判断.去重

    本文详解如何使用pandas查看dataframe的重复数据,判断是否重复,以及如何去重 dataframe数据样本: import pandas as pd df = pd.DataFrame({' ...

  7. tcpip协议

    几个概念 1.分层(我们使用四层模型更为贴合我们的实际网络) 分层是为什么,其实和公司中职位是一样的,不同职位的人做不同的事情,然后不同职位的人合起来,一起完成了数据传输的事情. 链路层  在这个层面 ...

  8. day 14 内置函数

    复习了解: \t   输出一个制表符,协助在输出文本时,垂直方向保持对齐 \n       换行符 print(r"\n ")  #  在字符串前面加r 不会改变字符串的内容 a ...

  9. mybatis源码学习(三)-一级缓存二级缓存

    本文主要是个人学习mybatis缓存的学习笔记,主要有以下几个知识点 1.一级缓存配置信息 2.一级缓存源码学习笔记 3.二级缓存配置信息 4.二级缓存源码 5.一级缓存.二级缓存总结 1.一级缓存配 ...

  10. 【Android - 控件】之MD - NavigationView的使用

    NavigationView是Android 5.0新特性——Material Design中的一个布局控件,可以结合DrawerLayout使用,让侧滑菜单变得更加美观(可以添加头部布局). Nav ...