如何使用borsh js实现struct类型数组的反序列化?
Borsh 结构体数组反序列化实现方案
针对JS/TS版本的borsh库,你可以按以下方案实现struct类型数组的反序列化:
方案1:直接反序列化顶层数组
borsh的deserialize方法第一个参数支持传入数组格式的类型声明:
- 动态长度数组(默认先读取4字节u32作为数组长度,再逐个解析元素):
// 直接传入[你的struct类]表示该类型的动态数组 const decoded_array = borsh.deserialize( [something], somethingSchema, data );
- 固定长度数组:
// 传入[你的struct类, 数组长度]表示对应长度的固定数组 const decoded_fixed_array = borsh.deserialize( [something, 10], // 示例为10个元素的固定数组 somethingSchema, data );
方案2:数组嵌套在其他struct内的处理
如果你的struct数组是另一个结构体的字段,直接在schema的字段声明中用数组格式定义即可:
class Container { something_list: something[] = [] constructor(fields?: {something_list: something[]}) { if (fields) { this.something_list = fields.something_list } } } // 扩展schema,复用已有的something定义 const containerSchema = new Map([ ...somethingSchema, [Container, { kind: 'struct', fields: [ // 动态数组写[something],固定数组写[something, 长度] ['something_list', [something]] ] }] ]) const decoded_container = borsh.deserialize(Container, containerSchema, data);
注意事项
- 序列化和反序列化的类型定义必须严格对齐,动态数组和固定数组的声明不能混用,否则会出现数据解析错位或报错。
- 你代码中使用的
u128类型在JS运行环境中会默认反序列化为BN.js实例,如需转普通数值要注意超过2^53-1的数值会存在精度丢失问题,建议大数场景直接用BN实例做运算。
内容的提问来源于stack exchange,提问作者Shivin Agarwal
相关产品推荐
相关产品推荐

