在平时的项目开发中,特别是涉及到物联网对接或者自定义协议的开发。开发者不免的就陷入到对象的序列化/反序列化中。 严重影响开发效率。 此项目针对于JAVA项目中的对象自定义序列化; 比如下面的一段代码:
public class Student {
private String name;
private int length;
private List<Long> phones;
private byte age;
// getter and setter ...
}
当我们定义好传输对象。和具体传输细节后。 我们需要将每个字段都按照协议解析到字节数组中。
假如以上代码在私有协议中定义如下:
字段名 | 字节数 | 解释 |
name | 10 | 用户名 |
length | 4 | 此字段决定phones字段长度 |
phones | 8 * length | long使用8个字节,长度由 length 决定 |
age | 1 | 年龄 |
如上: 对象序列化后总占用字节数为: 10 + 4 + (8 * length) + 1 个字节。
序列化到如下数组:
byte bytes[] = new byte[] {name_bytes, length_bytes, phones_bytes, age};
完成后打包发送出数据。
这一切看起来简单,实际在开发中需要了解并注意很多问题。比如:
- 字节转换
- 大小端
- 空值处理
- 溢出处理
- 序列化和反序列化控制
- buffer的使用
- 字节转换效率
- 等等等等
所以重点来了。如果你引入 Magic-Byte 。 我们仅仅需要在对象定义时同时描述字段使用字节数量,上面代码将会定义如下:
@MagicClass(autoTrim = true)
public class Student {
// 普通数据, 字符串长度为 10
@MagicField(order = 1, size = 10)
private String name;
// 普通数据, 整数, 此字段决定后续 phones 字段长度
@MagicField(order = 2)
private int length;
// 此List并未直接指定大小, 大小由 length 字段决定
@MagicField(order = 3, dynamicSizeOf = 2)
private List<Long> phones;
@MagicField(order = 4)
private byte age;
// getter and setter ...
}
在进行序列化和反序列化时,只需要简单使用以下方法:
怎么样,是不是简单了很多!~
void main() {
Student student1 = new Student();
byte[] bytes = Magic.unpack(student); // 对象转换为字节数组
Student student2 = Magic.pack(bytes, School.class); // 字节数组转换为对象
}
jar包maven地址
<dependency>
<groupId>io.github.misterchangray</groupId>
<artifactId>magic-byte</artifactId>
<version>1.0.2</version>
</dependency>
数据类型占用对照表:
数据类型 | 数据类型 | 字节大小 |
---|---|---|
byte | boolean | 1 |
short | char | 2 |
int | float | 4 |
long | double | 8 |
String | custom |
另外附上项目地址:
https://github.com/MisterChangRay/magic-bytehttps://github.com/MisterChangRay/magic-byte