-
Notifications
You must be signed in to change notification settings - Fork 23
dynamicSizeOf 属性详解
ray.zh edited this page Dec 2, 2023
·
6 revisions
在开发过程中,可以定义一些动态的字段解析,如以下定义:
public class Teacher { @MagicField(order = 1) private int sizeOfStucent; // 这里引用当前对象sizeOfStucent 属性 @MagicField(order = 2, dynamicSizeOf = "sizeOfStucent") private List<Student> students; // string 也支持变长 @MagicField(order = 3) private int sizeOfName; // string 长度取 sizeOfName; 需要注意的是这里是字节数, 不是字符数 // 这里使用#号代表绝对路径搜寻, 因为此对象本来就是根节点, 所以 "sizeOfName" 和 "#sizeOfName" 都搜寻的属性将会是同一个 @MagicField(order = 4, dynamicSizeOf = "#sizeOfName") private String name; }
在以上结构中, students 的成员数是通过取sizeOfStucent得到的。
此结构需要注意以下几点:
- dynamicSizeOf 支持绝对路径引用(使用#号打头)和相对路径(直接使用属性)
-
"a"是指相对于当前对象的 a 属性 -
"a.b"是指相对于当前对象的 a 属性,所指向对象的 b 属性 -
"#a"是指从根路径查开始搜寻 a 属性 -
"#a.b"是指根路径开始搜寻对象的 a 属性所指向对象的 b 属性
-
- dynamicSizeOf 序列化时, 引用值为真实序列化个数。
- 对象序列化字节时,如果
sizeOfStucent>0 && students.size() > 0, 框架会使用sizeOfStucent属性值序列化, 多的元素将会被移除 - dynamicSizeOf 属性 和 size属性 不能并存
- dynamicSizeOf 可以使用在 list, array, string 这三种数据类型中
- dynamicSizeOf 引用的字段类型仅能为
byte, short, int, UByte, UShort, UInt, UNumber, 他们字节数参考首页介绍。 - dynamicSizeOf 不可引用其他类中的字段, 仅能引用当前类字段且字段声明顺序必须位于当前字段前。
实际序列化举例:
- 如果
sizeOfStucent=0 && students.size() > 1, 框架将不会序列化任何对象 - 如果
sizeOfStucent=1 && students.size() > 2, 框架将序列化一个对象 - 如果
sizeOfStucent=3 && students.size() = 1, 框架将序列化一个对象, 另外2个将会将数据区填充为0x00 - 如果
sizeOfStucent=Integer.MAX && students.size() = 0, 若可用内存不足, 框架将会抛出OOM异常.