微信小程序本地存储与登录页面处理实例详细讲解
765
2022-11-04
Taira 轻量的数据 byte 序列化/反序列化工具
Taira
轻量的数据 byte 序列化/反序列化工具
特点
简单易用的 API。toBytes()和fromBytes()轻松解决 byte 序列化/反序列化高效的处理效率、极小的数据量为 IoT 而生(或是任何对传输数据量有要求的场景) 很多低功耗单片机解析 Json 开销太大,ProtoBuf/FlatBuf 引入成本太高IoT 场景下为了通信效率,需要信息密度更高的字节流协议
快速开始
添加依赖
Gradle
dependencies { compile 'com.gotokeep.keep:taira:0.1.4'}
Pom
Sample
Foo foo = new Foo();// 序列化到 bytesbyte[] result = Taira.DEFAULT.toBytes(foo)// 反序列化到 ObjectFoo receivedFoo = Taira.DEFAULT.fromBytes(receivedBytes);
/** * Model 定义 */class Foo implements TairaData { @ParamField(order = 0) public int value;}
应用实例
如下图在 IoT 场景下,客户端和硬件设备之间一条设置用户信息协议,协议内容如下
Header:通用的数据包头部,包含分包标识 flag、协议类型 type、协议数据长度 length、协议数据内容 payloadPayload:对应此类型协议的用户信息
详细使用
TairaData
实现这个接口的 data class 才允许序列化/反序列化,且实现类必须有无参构造函数
支持的字段类型
基本类型:byte、boolean、char、short、int、float、long、doubleByteArray 类型:String、byte[]集合类型:List、Set、非 byte 的 Array嵌套 TairaData 类型
一些限制:
集合类型的成员类型只能为基本类型、嵌套 TairaData 类型(但是不允许定义为 interface 和 abstract)
ParamField 注解
order:定义 field 的顺序,用于所有类型字段bytes:定义 field 序列化使用的 byte 长度,可用在基本类型上时可以用于兼容其他平台的数据长度、节约传输数据量;也可用于定长类型用于限制长度length:定义 List、Set、数组的长度
一些限制:
order 必须是从 0 递增的连续整数,任意两个 field 的 order 不能相同ByteArray 类型必须指定 bytes 值,但是在非嵌套 TairaData 的最大 order 上可以不指定集合类型 必须指定 length,但是在非嵌套 TairaData 的最大 order 的字段上时可以省略
字节序/字符集
默认可以直接使用 Taira.DEFAULT,如果需要指定字节序或处理 String 时的字符集,可以使用 Taira(ByteOrder order, Charset charset) 构造实例
异常处理
TairaAnnotationException:序列化/反序列化之前会根据上述规则进行检查,违反规则的时候会抛出TairaIllegalValueException:序列化的时候会检查实际数据是否满足定义长度,超出定义的 bytes/length 值的时候会抛出TairaInternalException:内部错误,设置Taira.DEBUG = true时会抛出
简单对比 Gson
Sample 处理一个三层嵌套包含各种类型的 data class,执行 1000 次结果:序列化/反序列化速度快于 Gson,且数据长度只有 Gson 的 1/5 - 1/3
// 原始 data class 结构fooObject: Foo{byteField=2, barField=Bar{innerArrayVal=[Baz{bazinga=1}, Baz{bazinga=3}, Baz{bazinga=5}], floatVal=123.2, shortVal=11, longVal=1242354, booleanVal=true}, intField=103, doubleField=123.21, charField=$, bytesField=[11, 22, 33, 44], stringField='world', intListField=[3, 5, 9]}// Taira 序列化Taira serialize x 1000 time cost: 132Taira serialize data size: 59// Taira 反序列化Taira deserialize x 1000 time cost: 58Taira deserialize result: Foo{byteField=2, barField=Bar{innerArrayVal=[Baz{bazinga=1}, Baz{bazinga=3}, Baz{bazinga=5}], floatVal=123.2, shortVal=11, longVal=1242354, booleanVal=true}, intField=103, doubleField=123.21, charField=$, bytesField=[11, 22, 33, 44, 0], stringField='world', intListField=[3, 5, 9]}// Gson 序列化Gson serialize x 1000 time cost: 218Gson serialize data size: 279// Gson 反序列化Gson deserialize x 1000 time cost: 83Gson deserialize result: Foo{byteField=2, barField=Bar{innerArrayVal=[Baz{bazinga=1}, Baz{bazinga=3}, Baz{bazinga=5}], floatVal=123.2, shortVal=11, longVal=1242354, booleanVal=true}, intField=103, doubleField=123.21, charField=$, bytesField=[11, 22, 33, 44], stringField='world', intListField=[3, 5, 9]}
License
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~