LiteByte教程

2019/12/28 0:28:20

本文主要是介绍LiteByte教程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

转载请标明原文地址:https://segmentfault.com/a/11...

简介

icon_1_alpha_256x72.png
LiteByte是一种轻量级的二进制数据交换格式。
体积小巧、简单易用是设计目标。主要用于解决前后台数据传输量的问题。

作者:冰封百度(ZhangYu)
设计的灵感来源于C# struct内存对齐后的紧凑格式。

特点

1.紧凑的二进制数据格式,支持变长整型,数据量小。
2.用近似代码定义类的方式定义对象结构,使用方便。

实现思路

把一个对象分为两个部分:结构和值。
结构用配置文件定义,越方便越好。
值用于网络传输,越小越好。

前后台依赖相同的结构配置文件,转换时把对象的值拆出来传输,解析时把值还原成对象。

使用方法

1.创建自定义结构文件CustomType.lbs (LiteByte Schema 文本文件)
2.定义对象字段(像写类一样写结构、类型和名称)
3.调用LBUtil.Serialize(object) 把对象序列化成二进制数据,
调用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);

// 反序列化:
PlayerInfo info = LBUtil.Deserialize<PlayerInfo>(typeName, bytes);
// bytes长度:31字节

转换结果:
转换结果.png

代码说明:
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
Int48(long) 6字节 -140737488355328 ~ 140737488355327
Int56(long) 7字节 -36028797018963968 ~ 36028797018963967
Int64(long) 8字节 -9223372036854775808 ~ 9223372036854775807
UInt8(byte) 1字节 0 ~ 255
UInt16(ushort) 2字节 0 ~ 65535
UInt24(uint) 3字节 0 ~ 16777215
UInt32(uint) 4字节 0 ~ 4294967295
UInt40(ulong) 5字节 0 ~ 1099511627775
UInt48(ulong) 6字节 0 ~ 281474976710655
UInt56(ulong) 7字节 0 ~ 72057594037927935
UInt64(ulong) 8字节 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种)

类型 表达式
数组 类型名称[]
字典(未实现) 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;

}

数组 结构1:

struct ArrayST {
    int[] ids;    
}

数组 结构2:

struct ArrayST {
    string[] names;    
}

登录信息 结构:

struct LoginInfoST {

    string username;
    string password;

}

用户信息 结构2:

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...
测试Demo:
链接:https://pan.baidu.com/s/1yQVn...
提取码:lio4



这篇关于LiteByte教程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程