实体编解码器
2025/3/1小于 1 分钟
实体编解码器
介绍
提示
这里介绍的是 io.github.hylexus.xtream.codec.core.EntityCodec
EntityCodec 用来支持基于注解的编解码。这里的注解指的是前面提到的:
@XtreamField()@Preset.RustStyle.xxx()@Preset.JtStyle.xxx()- 自定义注解 ...
本质上 EntityCodec 是 EntityEncoder 和 EntityDecoder 的组合。
示例
下面以 @Preset.RustStyle.xxx() 风格的注解为例,介绍如何使用 EntityCodec:
class EntityCodecTest extends BaseEntityCodecTest {
@Getter
@Setter
@ToString
@Accessors(chain = true)
public static class UserEntity {
@Preset.RustStyle.u32(desc = "用户ID(32位无符号数1)")
private Long id;
// prependLengthFieldType: 前置一个 u8 类型的字段表示当前字段的长度
@Preset.RustStyle.str(prependLengthFieldType = PrependLengthFieldType.u8, desc = "用户名(UTF-8)")
@Preset.RustStyle.str(prependLengthFieldType = PrependLengthFieldType.u8, desc = "用户名(GBK)", version = {1, 2}, charset = XtreamConstants.CHARSET_NAME_GBK)
private String name;
@Preset.RustStyle.u16(desc = "年龄(16位无符号数)")
private Integer age;
// prependLengthFieldType: 前置一个 u8 类型的字段表示当前字段的长度
@Preset.RustStyle.str(prependLengthFieldType = PrependLengthFieldType.u8, desc = "地址")
private String address;
}
UserEntity userEntity;
@BeforeEach
void setUp() {
userEntity = new UserEntity()
.setId(100L)
.setName("无名氏")
.setAge(1024)
.setAddress("保密");
}
@Test
void testVersion2() {
doCodecTest(2, userEntity, (source, hexString, decoded) -> {
doCompare(source, decoded);
assertEquals("0000006406cedec3fbcacf040006e4bf9de5af86", hexString);
assertTrue(hexString.contains(hexStringForGbk(userEntity.getName())));
}, false);
doCodecTest(2, userEntity, (source, hexString, decoded) -> {
doCompare(source, decoded);
assertTrue(hexString.contains(hexStringForGbk(userEntity.getName())));
assertEquals("0000006406cedec3fbcacf040006e4bf9de5af86", hexString);
}, true);
}
@Test
void testVersion1() {
doCodecTest(1, userEntity, (source, hexString, decoded) -> {
doCompare(userEntity, decoded);
assertTrue(hexString.contains(hexStringForGbk(userEntity.getName())));
assertEquals("0000006406cedec3fbcacf040006e4bf9de5af86", hexString);
}, false);
doCodecTest(1, userEntity, (source, hexString, decoded) -> {
doCompare(userEntity, decoded);
assertTrue(hexString.contains(hexStringForGbk(userEntity.getName())));
assertEquals("0000006406cedec3fbcacf040006e4bf9de5af86", hexString);
}, true);
}
@Test
void testVersionDefault() {
doCodecTest(XtreamField.ALL_VERSION, userEntity, (source, hexString, decoded) -> {
doCompare(source, decoded);
assertTrue(hexString.contains(hexStringForUtf8(userEntity.getName())));
assertEquals("0000006409e697a0e5908de6b08f040006e4bf9de5af86", hexString);
}, false);
doCodecTest(XtreamField.ALL_VERSION, userEntity, (source, hexString, decoded) -> {
doCompare(source, decoded);
assertTrue(hexString.contains(hexStringForUtf8(userEntity.getName())));
assertEquals("0000006409e697a0e5908de6b08f040006e4bf9de5af86", hexString);
}, true);
}
private void doCompare(UserEntity expected, UserEntity actual) {
assertEquals(expected.getId(), actual.getId());
assertEquals(expected.getName(), actual.getName());
assertEquals(expected.getAge(), actual.getAge());
assertEquals(expected.getAddress(), actual.getAddress());
}
}