Comments (9)
dynamicSize = 5, 是指这个属性最大字节或成员为5
dynamicSizeOf=5, 是指这个属性的数据长度是从另外一个对象成员 order=5中取的值
from magic-byte.
如果两个都标记,取值就不确定。造成混乱
from magic-byte.
正常情况下,数据定义会是:报文头, 长度, 可变数据体, 校验和
但是某些情况下,没有长度,而且数据体本身长度也是变长, 但是已知报文头和校验和长度固定,那么就可以标记为dynamicSize并且不影响解析。当然这是在数据体中没有其他变长的情况下。
也就是说一个数据体, 如果中间有且只有一段数据是变长的的, 那么我们可以根据其他固定的字节数,算出来这个动态数据的大小并解析,有则解析,没有就忽略,也就是即使是中间数据体没有,也不影响解析,这就是dynamicSize的作用。
但是如果数据定义是:报文头, 可变数据体1, 可变数据体2, 校验和
这种情况下,dynamicSize是无法工作的。因为无法推出可变数据体1和可变数据体2的分界位置。
不知道我这样说明白没有。
但是一个数据体,中间有个几段都是动态的, 那么你就不能不能使用dynamicSize, 因为你推不回去了。
from magic-byte.
我明白你的意思。你担心的是 动态计算数据有多个 、动态计算数据不在最后。
检测应该是: 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 吗? 对内存有影响吗?
from magic-byte.
`
@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;
`
比如这种定义格式
from magic-byte.
` @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
from magic-byte.
@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理论可以推定的。
但是这种报文设计本来也是不标准,扩展性也不强,所以也就直接不支持了。
所有数据体应该都是有长度标识才行,即使是可变长度!!!
from magic-byte.
好的,感谢解答...有些协议定义的就是那么的不可思议..
from magic-byte.
好的,感谢解答...有些协议定义的就是那么的不可思议..
这种的话,目前只能通过自定义解析器来实现
from magic-byte.
Related Issues (20)
- MConverter 的 unpack 接口希望能把要序列化的对象信息作为入参传入 HOT 3
- 希望可以自定义实现校验和且支持 byte[] 类型作为校验和数据类型 HOT 5
- dynamicSize 支持接口类 HOT 1
- dynamicSizof wiki 没更新 HOT 2
- 如果 dynamicsizeof 指向的属性名重名了,会导致序列化结果错误
- @MagicConverter 和 dynamicSize 没法共存 HOT 2
- 能否提供一个方法获取标记为 magicclass 的类的二进制数据长度 HOT 15
- @MagicConverter 的 attachParams 能否通过读取别的值获取参数 HOT 8
- 新增一个方法:返回读取的字节数和对象
- 自定义序列化传入的Object,应该传入根基对象 HOT 5
- 自定义序列化 unpack 方法希望传入根对象
- 异常栈无法看出报错位置 HOT 3
- byte[] 这种不定长类型如果配置了 custom 注解还检查是否指定长度 HOT 1
- BUG:作为属性的类的属性如果都使用了 @MagicConverter 将会导致反序列结果不正确 HOT 5
- BUG:子类继承父类的时候序列化结果为空数组 HOT 1
- 新版本没有发布到**仓库 HOT 1
- 框架序列化的数据能否自动补齐 HOT 8
- 嵌套 custom convert 的 rootObj 不是最顶层
- 功能增强:反序列化方法可以传入一个 customConvert 变量
- 二进制数据长度小于一个 MagicClass 所有属性的长度的时候,数据读取完了还会继续反序列化
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from magic-byte.