You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:39:04