介绍
只需要给 EntityCodec
的 encode
或 decode
方法传入一个 CodecTracker
实例即可追踪每个字段的编解码详情。
注意
警告
CodecTracker
的设计目的仅仅是用来调试。 会对编解码性能产生一定影响。
基于 ReactorNetty 的私有协议编解码库
只需要给 EntityCodec
的 encode
或 decode
方法传入一个 CodecTracker
实例即可追踪每个字段的编解码详情。
警告
CodecTracker
的设计目的仅仅是用来调试。 会对编解码性能产生一定影响。
提示
这里介绍的是 io.github.hylexus.xtream.codec.core.EntityCodec
EntityCodec
用来支持基于注解的编解码。这里的注解指的是前面提到的:
@XtreamField()
@Preset.RustStyle.xxx()
@Preset.JtStyle.xxx()
这里说的 参数解析器 指的是 XtreamHandlerMethodArgumentResolver
。
名字比较长,但从命名中可以看出来它本质上是一个 方法参数的解析器。
下面代码段中 processMessage0200V2019
方法的所有参数都是通过 XtreamHandlerMethodArgumentResolver
解析出来的:
@Component
@Jt808RequestHandler
public class DemoJt808RequestHandler {
@Jt808RequestHandlerMapping(messageIds = 0x0200, versions = Jt808ProtocolVersion.VERSION_2019)
@Jt808ResponseBody(messageId = 0x8001, maxPackageSize = 1000)
public Mono<ServerCommonReplyMessage> processMessage0200V2019(
XtreamExchange exchange,
XtreamSession xtreamSession,
XtreamRequest xtreamRequest,
Jt808Request jt808Request,
DefaultXtreamRequest defaultXtreamRequest,
XtreamResponse xtreamResponse,
DefaultXtreamResponse defaultXtreamResponse,
Jt808RequestEntity<BuiltinMessage0200> requestEntity,
@Jt808RequestBody DemoLocationMsg01 msg01,
@Jt808RequestBody DemoLocationMsg02 msg02,
@Jt808RequestBody ByteBuf buf01,
@Jt808RequestBody ByteBuf buf02,
@Jt808RequestBody(bufferAsSlice = false) ByteBuf buf03,
@Jt808RequestBody(bufferAsSlice = false) ByteBuf buf04) {
log.info("v2019-0x0200: {}", msg01);
assertNotSame(buf01, buf02);
assertNotSame(buf01, buf03);
assertSame(buf03, buf04);
assertSame(exchange.request(), xtreamRequest);
assertSame(exchange.request(), jt808Request);
assertSame(exchange.request(), defaultXtreamRequest);
assertSame(exchange.response(), xtreamResponse);
assertSame(exchange.response(), defaultXtreamResponse);
final ServerCommonReplyMessage responseBody = ServerCommonReplyMessage.success(jt808Request);
return Mono.just(responseBody);
}
}
内置注解都是从 @XtreamField
注解扩展而来的。目前有两种风格的注解:
Rust
数据类型命名风格JT/T 808
协议数据类型命名风格提示
Rust
风格内置注解
JT/T 808
风格的注解只支持无符号,因为 JT/T 808
官方文档里都是无符号数@XtreamField
注解
@XtreamField
来进行扩展自定义注解都是通过元注解 @XtreamField
的来实现的。
本示例将演示通过 @XtreamField
来实现一个自定义的日期注解。
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@XtreamField(fieldCodec = MyDateTypeFieldCodec.class, dataType = BeanPropertyMetadata.FiledDataType.basic)
public @interface MyDateType {
@AliasFor(annotation = XtreamField.class, attribute = "order")
int order() default -1;
@AliasFor(annotation = XtreamField.class, attribute = "condition")
String condition() default "";
}
长度 | 符号位 | JavaType | Rust风格注解 | JT风格注解 |
---|---|---|---|---|
1 | 无 | byte/Byte |
@Preset.RustStyle.u8 |
@Preset.JtStyle.Byte |
1 | 有 | short/Short |
@Preset.RustStyle.i8 |
-- |
2 | 无 | short/Short |
@Preset.RustStyle.u16 |
@Preset.JtStyle.WORD |
2 | 有 | int/Integer |
@Preset.RustStyle.i16 |
-- |
4 | 无 | int/Integer |
@Preset.RustStyle.u32 |
@Preset.JtStyle.DWORD |
4 | 有 | long/Long |
@Preset.RustStyle.i32 |
-- |
8 | 无 | long/Long |
@Preset.RustStyle.u64 |
-- |
@XtreamField
是最基础的注解。
内置的 别名(Alias) 注解 @Preset.RustStyle.xxx
和 @Preset.JtStyle.xxx
都是基于 @XtreamField
这个基础注解 衍生 的。
提示
注解别名都是依赖于 Spring
的 @org.springframework.core.annotation.AliasFor
注解实现的。