Closed wisetim closed 3 years ago
@wisetim pls check is this what u want? https://github.com/apache/dubbo-go-hessian2/pull/242/files
@wisetim pls check is this what u want? https://github.com/apache/dubbo-go-hessian2/pull/242/files
是的,这个正是我想要解决的第一个问题!除此之外,请问关于第二问题有没有解决办法呢?例如bytes里面包含了5个值,我是否能够在不反序列化前3个值的前提下,得到第4个值的反序列化结果?
@wisetim no, you can't in binary protocol of hessian, but you can do that in transfer protocol. I have updated the demo, which contains a skip logic.
u can't know whether it's the end of a string, until the final thunk. ref http://hessian.caucho.com/doc/hessian-serialization.html##string
在字节数组中,这些值之间有没有明确的分界点?(用来实现指定反序列化某个值)
如果你知道想要的对象,在第几个元数,可以跳过前面的值。可以参考我之前实现(根据参数个数,跳过不要的参数):
在字节数组中,这些值之间有没有明确的分界点?(用来实现指定反序列化某个值)
如果你知道想要的对象,在第几个元数,可以跳过前面的值。可以参考我之前实现(根据参数个数,跳过不要的参数):
这个信息我有的,我研究一下你的方法!
在字节数组中,这些值之间有没有明确的分界点?(用来实现指定反序列化某个值)
如果你知道想要的对象,在第几个元数,可以跳过前面的值。可以参考我之前实现(根据参数个数,跳过不要的参数):
我理解mosn里这种实现方式,并不是跳过反序列化参数,而是将反序列化后的结果丢弃不用?在调用decoder.Decode()的时候是不是已经进行了反序列化?
在字节数组中,这些值之间有没有明确的分界点?(用来实现指定反序列化某个值)
如果你知道想要的对象,在第几个元数,可以跳过前面的值。可以参考我之前实现(根据参数个数,跳过不要的参数): https://github.com/mosn/mosn/blob/71fa6c9788cad8a349ebc4602f2380f98e782afd/pkg/protocol/xprotocol/dubbo/decoder.go#L231
我理解mosn里这种实现方式,并不是跳过反序列化参数,而是将反序列化后的结果丢弃不用?在调用decoder.Decode()的时候是不是已经进行了反序列化?
会丢弃反序列化结果,如果非得读取hessian对象,并且完全不去构造对象,比如读取定长并直接丢弃,在技术上可行的(但是需要大概hessian go库)。另外,如果评估可以跳过参数能接受,更方便一些。如果对性能有严苛需求,更应该在序列化结构上优化,比如每次序列化对象之前,写一个定长标识序列化对象大小,然后写序列化的Byte,这样可以快速skip。或者把必读的对象参数,固定在数组最前方。
目前非go库hessian框架只能skip字节流长度,也做不到直接跳过参数个数,通过程序结构优化更合理一些。
在字节数组中,这些值之间有没有明确的分界点?(用来实现指定反序列化某个值)
如果你知道想要的对象,在第几个元数,可以跳过前面的值。可以参考我之前实现(根据参数个数,跳过不要的参数): https://github.com/mosn/mosn/blob/71fa6c9788cad8a349ebc4602f2380f98e782afd/pkg/protocol/xprotocol/dubbo/decoder.go#L231
我理解mosn里这种实现方式,并不是跳过反序列化参数,而是将反序列化后的结果丢弃不用?在调用decoder.Decode()的时候是不是已经进行了反序列化?
会丢弃反序列化结果,如果非得读取hessian对象,并且完全不去构造对象,比如读取定长并直接丢弃,在技术上可行的(但是需要大概hessian go库)。另外,如果评估可以跳过参数能接受,更方便一些。如果对性能有严苛需求,更应该在序列化结构上优化,比如每次序列化对象之前,写一个定长标识序列化对象大小,然后写序列化的Byte,这样可以快速skip。或者把必读的对象参数,固定在数组最前方。
目前非go库hessian框架只能skip字节流长度,也做不到直接跳过参数个数,通过程序结构优化更合理一些。
如果不改动hessian go库,仅仅实现一个在byte[]中找到第x个值的起始位置,难度高吗?另外,byte[]中的每个tag(I、S、O等)可以认为是一个值的起始位置吗?
在字节数组中,这些值之间有没有明确的分界点?(用来实现指定反序列化某个值)
如果你知道想要的对象,在第几个元数,可以跳过前面的值。可以参考我之前实现(根据参数个数,跳过不要的参数): https://github.com/mosn/mosn/blob/71fa6c9788cad8a349ebc4602f2380f98e782afd/pkg/protocol/xprotocol/dubbo/decoder.go#L231
我理解mosn里这种实现方式,并不是跳过反序列化参数,而是将反序列化后的结果丢弃不用?在调用decoder.Decode()的时候是不是已经进行了反序列化?
会丢弃反序列化结果,如果非得读取hessian对象,并且完全不去构造对象,比如读取定长并直接丢弃,在技术上可行的(但是需要大概hessian go库)。另外,如果评估可以跳过参数能接受,更方便一些。如果对性能有严苛需求,更应该在序列化结构上优化,比如每次序列化对象之前,写一个定长标识序列化对象大小,然后写序列化的Byte,这样可以快速skip。或者把必读的对象参数,固定在数组最前方。 目前非go库hessian框架只能skip字节流长度,也做不到直接跳过参数个数,通过程序结构优化更合理一些。
如果不改动hessian go库,仅仅实现一个在byte[]中找到第x个值的起始位置,难度高吗?另外,byte[]中的每个tag(I、S、O等)可以认为是一个值的起始位置吗?
听起来太hack了,场景太小众。 建议通过优化程序数据结构。
byte[]中的每个tag(I、S、O等)可以认为是一个值的起始位置吗。
做不到的,这块需求会打破hessian规范
在字节数组中,这些值之间有没有明确的分界点?(用来实现指定反序列化某个值)
如果你知道想要的对象,在第几个元数,可以跳过前面的值。可以参考我之前实现(根据参数个数,跳过不要的参数): https://github.com/mosn/mosn/blob/71fa6c9788cad8a349ebc4602f2380f98e782afd/pkg/protocol/xprotocol/dubbo/decoder.go#L231
我理解mosn里这种实现方式,并不是跳过反序列化参数,而是将反序列化后的结果丢弃不用?在调用decoder.Decode()的时候是不是已经进行了反序列化?
会丢弃反序列化结果,如果非得读取hessian对象,并且完全不去构造对象,比如读取定长并直接丢弃,在技术上可行的(但是需要大概hessian go库)。另外,如果评估可以跳过参数能接受,更方便一些。如果对性能有严苛需求,更应该在序列化结构上优化,比如每次序列化对象之前,写一个定长标识序列化对象大小,然后写序列化的Byte,这样可以快速skip。或者把必读的对象参数,固定在数组最前方。 目前非go库hessian框架只能skip字节流长度,也做不到直接跳过参数个数,通过程序结构优化更合理一些。
如果不改动hessian go库,仅仅实现一个在byte[]中找到第x个值的起始位置,难度高吗?另外,byte[]中的每个tag(I、S、O等)可以认为是一个值的起始位置吗?
听起来太hack了,场景太小众。 建议通过优化程序数据结构。
byte[]中的每个tag(I、S、O等)可以认为是一个值的起始位置吗。
做不到的,这块需求会打破hessian规范
好的,谢谢两位的解答!
一个字节数组bytes,里面包含了若干个hessian序列化后的值,可能是基础类型,也可能是自定义的Java对象。