# dwarfeng-dct **Repository Path**: dwarfeng/dwarfeng-dct ## Basic Information - **Project Name**: dwarfeng-dct - **Description**: Dwarfeng(赵扶风)的 DCT 服务,基于 subgrade 项目,提供了数据编码与传输的功能。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-06-02 - **Last Updated**: 2025-06-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dwarfeng-dct Dwarfeng(赵扶风)的 DCT 服务,基于 `subgrade` 项目,提供了数据编码与传输的功能。 --- ## DCT 能够做什么? DCT 是数据编码与传输(Data Coding and Transmission)的缩写。总体来说,DCT 服务提供了一种风格统一,易于阅读, 适用于多种数据类型的数据编码与传输的数据处理方式。这种数据处理方式通过 `subgrade` 项目的处理器对外提供。 您可以在以下场景中使用 `dwarfeng-dct` 项目: 1. 在设备侧采集多种类型的数据,将数据编码后发送到消息队列,使用时从消息队列中获取数据,解码后进行处理,且不丢失数据类型信息。 2. 采集的数据类型不固定,使用数据库存储数据,且不丢失数据类型信息。 3. 编码后的数据相对可读,不像 Base64 编码那样难以阅读,且数据编码后长度相对较短。 ## 文档 该项目的文档位于 [docs](./docs) 目录下,包括: ### wiki wiki 为项目的开发人员为本项目编写的详细文档,包含不同语言的版本,主要入口为: 1. [简介](./docs/wiki/zh_CN/Introduction.md) - 镜像的 `README.md`,与本文件内容基本相同。 2. [目录](./docs/wiki/zh_CN/Contents.md) - 文档目录。 ## 关于数据 `dwarfeng-dct` 项目中的数据指的是现实中设备运行过程中产生的数据,例如: - 计算机的 CPU 温度、使用率等。 - 电梯的运行状态、故障信息等。 - 机床的能耗、运行状态等、报警文本等。 数据具有如下的特点: 1. 每个数据都有一个数据值,数据值的类型可以是任意的,如 `boolean`、`int`、`double`、`String` 等,数据值可以是 `null`。 2. 每个数据都有自己的发生时间。 3. 每个数据都属于一个数据点位,数据点位的类型是 `LongIdKey`,每一个数据点位都有一个固定的意义。 以下是一个示例,某设备采集了一台计算机一小时内的开机情况和 CPU 使用率(为了简化,数据每 10 分钟记录一次): | 数据点 | 发生时间 | 值 | |-----------|-------|-------| | 1(是否开机) | 00:00 | false | | 2(CPU使用率) | 00:00 | null | | 1(是否开机) | 00:10 | true | | 2(CPU使用率) | 00:10 | 0.10 | | 1(是否开机) | 00:20 | true | | 2(CPU使用率) | 00:20 | 0.95 | | 1(是否开机) | 00:30 | true | | 2(CPU使用率) | 00:30 | 0.70 | | 1(是否开机) | 00:40 | true | | 2(CPU使用率) | 00:40 | 0.50 | | 1(是否开机) | 00:50 | false | | 2(CPU使用率) | 00:50 | null | 通过更多更密集的数据记录,可以更加精确的描述设备的运行情况。 设备采集的这些数据,可以通过 `dwarfeng-dct` 项目进行编码,编码后的数据可以存储到数据库中,也可以通过消息队列发送到其他地方。 使用 `dwarfeng-dct` 编码后的数据,解码后可以还原为原始数据,值的类型信息不会丢失。 ## 特性 1. Subgrade 架构支持。 2. 数据采用统一接口定义,支持不同实现。 3. 支持编码/解码常见的基本类型。 4. 编码/解码基于 `FastJson`,编码后的数据相对可读,且编码/解码速度快。 5. 所有接口均有默认实现,使用简单,也可以自定义实现。 运行 `src/test` 下的示例以观察全部特性。 | 示例类名 | 说明 | |--------------------|------------| | DataCodingExample | 数据编码器的使用示例 | | ValueCodingExample | 值编码器的使用示例 | ## 值的类型支持 `dwarfeng-dct` 项目支持的值的类型如下: | 类型名 | 前缀名 | 优先级 | 值编解码器类型 | 说明 | |--------------|--------------|-----|------------------------|--------------------------| | BigDecimal | big_decimal | 正常 | BigDecimalValueCodec | | | BigInteger | big_integer | 正常 | BigIntegerValueCodec | | | Boolean | boolean | 正常 | BooleanValueCodec | | | byte[] | byte | 正常 | ByteValueCodec | 不支持 Byte[],使用 Base64 编码 | | Byte | byte | 正常 | ByteValueCodec | | | Character | character | 正常 | CalendarValueCodec | | | Date | date | 正常 | CalendarValueCodec | 将 Date 序列化为时间戳 | | Double | double | 正常 | DoubleValueCodec | | | Float | float | 正常 | FloatValueCodec | | | Integer | integer | 正常 | IntegerValueCodec | | | Long | long | 正常 | LongValueCodec | | | Short | short | 正常 | ShortValueCodec | | | String | string | 正常 | StringValueCodec | | | Serializable | serializable | 正常 | SerializableValueCodec | 几乎支持任何可序列化的对象,但不可读,应最后考虑 | ## 安装说明 1. 下载源码。 - 使用 git 进行源码下载。 ``` git clone git@github.com:DwArFeng/dwarfeng-ftp.git ``` - 对于中国用户,可以使用 gitee 进行高速下载。 ``` git clone git@gitee.com:dwarfeng/dwarfeng-ftp.git ``` 2. 项目安装。 进入项目根目录,执行 maven 命令 ``` mvn clean source:jar install ``` 3. 项目引入。 在项目的 pom.xml 中添加如下依赖: ```xml com.dwarfeng dwarfeng-dct ${dwarfeng-dct.version} ``` 4. enjoy it. --- ## 如何使用 1. 运行 `src/test` 下的 `Example` 以观察全部特性。 2. 观察项目结构,将其中的配置运用到其它的 subgrade 项目中。 ### 简单配置 加载 `com.dwarfeng.dct.config.SimpleDctConfig` 类,即可简单地获得单例模式的 `DataCodingHandler` 和 `ValueCodingHandler`。 在项目的 `application-context-scan.xml` 中追加 `com.dwarfeng.dct.configuration` 包中全部 bean 的扫描,示例如下: ```xml ``` 或者只扫描 `com.dwarfeng.dct.configuration` 包中的 `SimpleConfiguration`,示例如下: ```xml ``` ### 自定义配置 自定义配置较为灵活,可以在项目中的 `bean-definition.xml` 中追加配置,也可以自定义配置类。 自定义配置适用于以下场景: 1. 非单例模式的 `DataCodingHandler` 和 `ValueCodingHandler`。 2. 需要自定义 `FlatDataCodec` 和 `ValueCodec` 的实现。 由于自定义配置较为灵活,因此在此不做过多介绍,请开发者自行编写配置。 需要注意的是:`DataCodingHandler` 和 `ValueCodingHandler` 在使用之前需要调用 `init()` 方法进行初始化。 --- ## 集成/二次开发 ### 说明 `dwarfeng-dct` 项目支持通过集成/二次开发的方式扩展其功能,包括: 1. 自定义扁平数据编解码器,将 `Data` 序列化为 `JSON` 以外的其它格式。 2. 自定义值编解码器,扩展 `Data` 的值的支持类型。 开发人员只需要在项目中引用 `dwarfeng-dct` 的依赖,即可进行集成/二次开发,无需额外的配置。 ### 自定义扁平数据编解码器 #### 开发 `dwarfeng-dct` 项目中的 `FlatDataCodec` 接口定义了扁平数据编解码器的基本功能,开发人员可以通过实现该接口, 自定义扁平数据编解码器。扩展的编解码器可以将 `Data` 序列化为 `JSON` 以外的其它格式。 建议在实现 `FlatDataCodec` 接口的同时,继承 `AbstractFlatDataCodec` 类,该类对通用的业务逻辑进行了封装,如异常处理等。 继承 `AbstractFlatDataCodec` 类可以使开发人员更加专注于编解码业务的实现。 ```java import com.dwarfeng.dct.handler.fdc.AbstractFlatDataCodec; @SuppressWarnings("RedundantThrows") public class CustomFlatDataCodec extends AbstractFlatDataCodec { @Override protected String doEncode(FlatData target) throws Exception { // 实现编码逻辑,而不需要关注异常处理。 return xxx; } @Override protected FlatData doDecode(String text) throws Exception { // 实现解码逻辑,而不需要关注异常处理。 return xxx; } } ``` #### 使用 在构造 `DataCodingHandlerImpl` 时,将自定义的 `FlatDataCodec` 作为 `DataCodingConfig` 中的配置项传入即可,使用 `DataCodingConfig.Builder` 可以使这一过程更加简单。 ```java import com.dwarfeng.dct.handler.DataCodingHandler; import com.dwarfeng.dct.handler.DataCodingHandlerImpl; import com.dwarfeng.dct.handler.ValueCodingHandler; import com.dwarfeng.dct.struct.DataCodingConfig; import org.springframework.context.annotation.Configuration; @SuppressWarnings({"SpringFacetCodeInspection", "RedundantSuppression"}) @Configuration public class CustomConfiguration { @Bean public DataCodingHandler dataCodingHandler(ValueCodingHandler valueCodingHandler) { // 开发人员自己实现的 FlatDataCodec。 CustomFlatDataCodec customFlatDataCodec = new CustomFlatDataCodec(); DataCodingConfig config = new DataCodingConfig.Builder() .setFlatDataCodec(customFlatDataCodec) .setValueCodingHandler(valueCodingHandler) .build(); return new DataCodingHandlerImpl(config); } } ``` ### 自定义值编解码器 #### 开发 `dwarfeng-dct` 项目中的 `ValueCodec` 接口定义了值编解码器的基本功能,开发人员可以通过实现该接口, 自定义值编解码器。扩展的编解码器可以扩展 `Data` 的值的支持类型。 建议在实现 `ValueCodec` 接口的同时,继承 `AbstractValueCodec` 类,该类对通用的业务逻辑进行了封装,如异常处理等。 继承 `AbstractValueCodec` 类可以使开发人员更加专注于编解码业务的实现。 ```java import com.dwarfeng.dct.handler.vc.AbstractValueCodec; import javax.annotation.Nonnull; @SuppressWarnings("RedundantThrows") public class CustomValueCodec extends AbstractValueCodec { @Nonnull @Override protected String doEncode(@Nonnull Object target) throws Exception { // 实现解码逻辑,而不需要关注异常处理。 return xxx; } @Nonnull @Override protected Object doDecode(@Nonnull String text) throws Exception { // 实现解码逻辑,而不需要关注异常处理。 return xxx; } } ``` #### 使用 在构造 `ValueCodingHandlerImpl` 时,将自定义的 `ValueCodec` 作为 `ValueCodingConfig` 中的配置项传入即可,使用 `ValueCodingConfig.Builder` 可以使这一过程更加简单。 ```java import com.dwarfeng.dct.handler.ValueCodingHandler; import com.dwarfeng.dct.handler.ValueCodingHandlerImpl; import com.dwarfeng.dct.struct.ValueCodingConfig; import org.springframework.context.annotation.Configuration; @SuppressWarnings({"SpringFacetCodeInspection", "RedundantSuppression"}) @Configuration public class CustomConfiguration { @Bean public ValueCodingHandler valueCodingHandler() { // 开发人员自己实现的 ValueCodec。 CustomValueCodec customValueCodec = new CustomValueCodec(); ValueCodingConfig config = new ValueCodingConfig.Builder() .addCodec(someValueCodec1) .addCodec(someValueCodec2) .addCodec(someValueCodec3) .addCodec(customValueCodec) .build(); return new ValueCodingHandlerImpl(config); } } ```