# magic-byte
**Repository Path**: mtils/magic-byte
## Basic Information
- **Project Name**: magic-byte
- **Description**: 一种简单的方式将java对象转为字节数据,用于快速高效的自定义序列化/反序列化场景,类似C的Strcut结构体,多用于私有通讯协议实现。
- **Primary Language**: Java
- **License**: BSD-3-Clause
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 7
- **Forks**: 0
- **Created**: 2021-12-23
- **Last Updated**: 2025-06-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, 自定义序列化, 私有协议, 对象转字节, 对象序列化
## README
### 魔法字节(magic-byte)
[](https://github.com/misterchangray/magic-byte)
[](https://github.com/misterchangray/magic-byte/issues)
[](https://github.com/misterchangray/magic-byte/issues?q=is%3Aissue+is%3Aclosed)
[](./LICENSE)
[中文](https://github.com/MisterChangRay/magic-byte/blob/master/README.md)|[English](https://github.com/MisterChangRay/magic-byte/blob/master/README.en.md)
#### 1. 简介
在当代物联网行业中,由于隐私和安全问题,很多的公司选择使用自定义的私有二进制协议。
在C语言中,由于有结构体的加持,对象和字节数组转换起来就特别简单;但在java中,在没有原生支持的情况下,开发人员就只能够靠码力去读取解析数据然后转译成为对象
,流程如下图:

在这看似简单的编码/解码过程中其实会伴随很多人头疼的问题,例如:
- 大小端/网络字节序的处理
- 无符号数/有符号数的处理
- 多字节整数转换处理
- ASCII码与字节之间的转换处理
- 空指针/填充数据的处理
- 数组对象/嵌套对象的处理
此项目的目的便是尽可能的解决上述问题,让大家将更多的时间聚焦在业务中。
在引入`MagicByte`后,只需要在类定义的同时使用注解声明字段的数据类型。
接下来就只需要调用两个简单的方法即可进行序列化:用于对象转字节的`MagicByte.unpack();`和用于字节转对象的`MagicByte.pack()`。
是不是很简单?马上试试吧!
#### 2. 快速入门:
1. 引入Jar包;
2. `@MagicClass`对当前类进行全局配置
3. `@MagicField`对需要转换的JAVA对象属性进行标注,支持对象组合嵌套,注意:不支持继承
4. 使用`MagicByte.pack()`或`MagicByte.unpack()`对数据或对象进行快速的序列化或反序列化
5. (可选)支持使用`MagicByte.registerCMD`注册消息到 MagicByte, [前往查看示例](https://github.com/MisterChangRay/magic-byte/wiki/%E6%95%B0%E6%8D%AE%E5%AE%9E%E4%BD%93%E5%AE%9A%E4%B9%89%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5#1-%E4%BD%BF%E7%94%A8%E6%B6%88%E6%81%AF%E6%B3%A8%E5%86%8C%E8%A7%A3%E6%9E%90)
6. (可选)支持使用`@MagicConverter()`注解来实现自定义序列化;[前往查看枚举类自定义序列化示例](https://github.com/MisterChangRay/magic-byte/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BA%8F%E5%88%97%E5%8C%96%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5)
Maven项目可直接导入:
[点击查看版本列表](https://mvnrepository.com/artifact/io.github.misterchangray/magic-byte)
```
io.github.misterchangray
magic-byte
2.4.4
```
#### 3. 代码示例
以下为简单的框架功能展示,实际项目中数据实体类定义建议参考 [数据实体定义的最佳实践](https://github.com/MisterChangRay/magic-byte/wiki/%E6%95%B0%E6%8D%AE%E5%AE%9E%E4%BD%93%E5%AE%9A%E4%B9%89%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5)
下面的报文示例中, 共有 Student 和 School 两个数据报文:
```java
// declare class must use public
// 使用大端模式, 默认为大端
@MagicClass(byteOrder = ByteOrder.BIG_ENDIAN)
public class School {
// 10 byte, 普通数据类型, 占用10字节长度
@MagicField(order = 1, size = 10)
private String name;
// 2 byte, 长度字段, 数据序列化时将自动填充实际数据长度
@MagicField(order = 3, calcLength = true)
private short length;
// 支持组合模式, 这里嵌入了 Student 对象
// 总字节数 = students.bytes * length
@MagicField(order = 5, size = 2)
private Student[] students;
// 0 byte, 注意, 此处无法序列化, 不支持的数据类型将会被忽略
@MagicField(order = 7)
private List