Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
ray.zh edited this page Dec 3, 2023 · 15 revisions

1. Magic-Byte 是什么?

在平时的项目开发中,特别是涉及到物联网对接或者自定义协议的开发。开发者不免的就陷入到对象与字节流的的序列化/反序列化中, 严重影响开发效率。

这里用实际开发流程来举例说明,正常来说,一般开发的流程就大致如下:

1. 定义实体类

如下面的一段代码,假设以下代码是通信数据:

public class Student {
 private String name;
 private int length;
 private List<Long> phones;
 private byte age;
 // getter and setter ...
}
2. 约定协议细节并出具协议文档

这里基本上是约定报文内容及数据结构。然后出具详细的文档描述

3. 开始进行协议对接

这一步是最简单,也是最繁琐的步骤。 对于Java来说,此时需要将所有数据都按照约定进行处理解析和格式化 示例如下:

byte bytes[] = new byte[] {name_bytes, length_bytes, phones_bytes, age};

然而在编码/解码的过程中,时常伴随着以下问题:

  • 字节转换处理
  • 大小端处理
  • 空值,默认值处理
  • 溢出处理
  • 填充对齐处理
4. 开始收发数据

上述流程完成后,终于可以尝试进行通讯了

2. Magic-Byte的优势

上面简单介绍了下正常的开发流程,在整个流程中,第3步对于Java开发者来说不太友好。 因为对于类似C/C++的开发语言来说,它们结构体和字节数据之间可以直接进行强制转换。 但对于java来说,则需要使用Stream去读取, 在代码中问题在代码中体现的就是一个又一个的IF/ELSE, 它们到处充斥在代码中,业务代码和解析代码相互穿插,显得复杂且臃肿。

但如果引入 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 = MagicByte.unpack(student); // 对象转换为字节数组
 Student student2 = MagicByte.pack(bytes, School.class); // 字节数组转换为对象
}

怎么样,是不是很简单!从此以后,只需要聚焦业务实现啦,为你省下大把时间!~

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /