介绍
@DerivedField 用于从已解码的原始协议字段中衍生出业务视图,而无需改动原有的编解码字段。
典型的应用场景:
- 将
long类型的位段(如状态字)自动解析为Set<Enum>,而非手动编写位运算 - 将原始数值映射为可读的业务描述(如
0 → "offline",1 → "online") - 编码时将业务视图逆向回写为原始协议的字段值
2026/6/2大约 5 分钟
@DerivedField 用于从已解码的原始协议字段中衍生出业务视图,而无需改动原有的编解码字段。
典型的应用场景:
long 类型的位段(如状态字)自动解析为 Set<Enum>,而非手动编写位运算0 → "offline",1 → "online")在 之前的版本中,无论是 内置注解 还是 自定义注解,表达式 都是通过 SpEL 来实现的。
从 开始,xtream-codec 新增了 @Expression 注解。支持三种表达式:
协议是会进化的。版本升级时,往往只是部分字段发生变化:
u8,新版本变成了 u16若为每个版本维护一套独立的 Entity 类,代码将迅速膨胀,版本之间的差异淹没在重复的 boilerplate 中。
@XtreamField 的 version 属性便是为此而生——在 同一 Entity 类 中,通过 同一字段 上的多个注解声明,精确控制每个版本下该字段的编解码行为。
内置注解都是从 @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 "";
}
@XtreamField 是最基础的注解。
内置的 别名(Alias) 注解 @Preset.RustStyle.xxx 和 @Preset.JtStyle.xxx 都是基于 @XtreamField 这个基础注解 衍生 的。
提示
注解别名都是依赖于 Spring 的 @org.springframework.core.annotation.AliasFor 注解实现的。