Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dynamicSize & dynamicSizeOf 不能在一个类中同时存在吗? #18

Closed
xuelang2009 opened this issue Apr 19, 2023 · 9 comments
Closed

Comments

@xuelang2009
Copy link

有两点疑问:
1)dynamicSize 是标记动态计算的(总数-其他标记了长度=剩下的,就是它的数据), dynamicSizeOf 是标记从哪个成员上取长度的。它俩应该不冲突的。 我注释了检测,运行后的结果符合我的预期,但是不确定是否存在其他问题。
2)dynamicSize 必须带有 size 属性,然而size会自动裁剪。但是这个动态计算的长度是不固定的,我也不能确定size预设多少,只能将size标记足够大吗?对内存使用有影响吗?

@MisterChangRay
Copy link
Owner

dynamicSize = 5, 是指这个属性最大字节或成员为5
dynamicSizeOf=5, 是指这个属性的数据长度是从另外一个对象成员 order=5中取的值

@MisterChangRay
Copy link
Owner

如果两个都标记,取值就不确定。造成混乱

@MisterChangRay
Copy link
Owner

MisterChangRay commented Apr 19, 2023

正常情况下,数据定义会是:报文头, 长度, 可变数据体, 校验和

但是某些情况下,没有长度,而且数据体本身长度也是变长, 但是已知报文头和校验和长度固定,那么就可以标记为dynamicSize并且不影响解析。当然这是在数据体中没有其他变长的情况下。
也就是说一个数据体, 如果中间有且只有一段数据是变长的的, 那么我们可以根据其他固定的字节数,算出来这个动态数据的大小并解析,有则解析,没有就忽略,也就是即使是中间数据体没有,也不影响解析,这就是dynamicSize的作用。

但是如果数据定义是:报文头, 可变数据体1, 可变数据体2, 校验和
这种情况下,dynamicSize是无法工作的。因为无法推出可变数据体1和可变数据体2的分界位置。

不知道我这样说明白没有。

但是一个数据体,中间有个几段都是动态的, 那么你就不能不能使用dynamicSize, 因为你推不回去了。

@xuelang2009
Copy link
Author

我明白你的意思。你担心的是 动态计算数据有多个 、动态计算数据不在最后。
检测应该是: dynamicSize=true & order = 最后 | 其后面没有dynamicSizeOf标记了 ,这样是可以的。
1)《长度1、数据1,dynamicSizeOf=1》、《长度2、数据2,dynamicSizeOf=2》、《数据3, dynamicSize=true,size=?》这种情况下,应该是没有问题的。但是检测不过,说 dynamicSizeOf & dynamicSize 在类中(不是在同一成员属性上)不能同时存在。
2)《数据3, dynamicSize=true,size=?》 数据3的真实长度是 总长度-《长度1、数据1》- 《长度2、数据2》,但是数据3计算出的长度不是固定了,那么size = ? 我可以直接赋值 Integer.Max 吗? 对内存有影响吗?

@xuelang2009
Copy link
Author

`
@MagicClass
public class DynamicSizeWith2Field_test
{
@magicfield(order = 1, size = 10)
private String name;

//数据长度
@MagicField(order = 3)
private int len;
//数据value
@MagicField(order = 5, dynamicSizeOf = 3)
private ArrayList<Byte> boodsId;

//可变长度
//这个size,不确定最大多少,直接给最大值??????
@MagicField(order = 7, size = Integer.MAX_VALUE, dynamicSize = true)
private ArrayList<Byte> list;

`
比如这种定义格式

@MisterChangRay
Copy link
Owner

MisterChangRay commented Apr 19, 2023

` @MagicClass public class DynamicSizeWith2Field_test { @magicfield(order = 1, size = 10) private String name;

//数据长度
@MagicField(order = 3)
private int len;
//数据value
@MagicField(order = 5, dynamicSizeOf = 3)
private ArrayList<Byte> boodsId;

//可变长度
//这个size,不确定最大多少,直接给最大值??????
@MagicField(order = 7, size = Integer.MAX_VALUE, dynamicSize = true)
private ArrayList<Byte> list;

` 比如这种定义格式

你对数据体预估的最大值,最好不要设置为MAX,序列化输出时会填充0

@MisterChangRay
Copy link
Owner

@MagicClass public class DynamicSizeWith2Field_test { @magicfield(order = 1, size = 10) private String name;

//数据长度
@MagicField(order = 3)
private int len;
//数据value
@MagicField(order = 5, dynamicSizeOf = 3)
private ArrayList<Byte> boodsId;

//可变长度
//这个size,不确定最大多少,直接给最大值??????
@MagicField(order = 7, size = Integer.MAX_VALUE, dynamicSize = true)
private ArrayList<Byte> list;

} 比如这种 定义模式

嗯,这种模式下dynamic理论可以推定的。
但是这种报文设计本来也是不标准,扩展性也不强,所以也就直接不支持了。
所有数据体应该都是有长度标识才行,即使是可变长度!!!

@xuelang2009
Copy link
Author

好的,感谢解答...有些协议定义的就是那么的不可思议..

@MisterChangRay
Copy link
Owner

好的,感谢解答...有些协议定义的就是那么的不可思议..

这种的话,目前只能通过自定义解析器来实现

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants