Skip to content

dynamicSize 属性详解

ray.zh edited this page Nov 24, 2023 · 6 revisions

V2.1.0版本新增属性

此属性和 dynamicSizeOf 属性功能大致相同, 两者不同之处如下:

dynamicSizeOf 依赖于其他字段来标明当前成员数量

dynamicSize 是通过反推计算出当前成员数量的(当然这需要满足以下条件)

  • 消息可变部分只能有一处
  • 消息可变部分的消息字节数固定

dynamicSize属性用于兼容一些老的报文协议。一般不建议使用此属性。且此属性仅能适用于String, Array, List

public class Teacher {
   @MagicField(order = 1)
   private int id;
   // 自动裁剪和包装, 此字段成员数最大 5 个
   @MagicField(order = 2, dynamicSize = true, size = 5)
   private List<Student> students;
   @MagicField(order = 3)
   private int name;
}

如上述数据结构, Teacher中有且只有students属性是可变(0-5个之间), 而且Student字节数固定.

此时Student成员数量可以通过总字节数倒推。 即:students 属性成员数量 = (总字节数 - 属性sizeOfstucent字节数 - 属性name字节数) / 单个Student属性字节数

所以 dynamicSize 字段属性标记时, 需要保证整个数据结构只有当前字段长度可变,如此才能反推。