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

Solana程序中如何为含String的结构体实现BorshDeserialize序列化

错误原因

你遇到的报错并非String类型无法被Borsh序列化/反序列化,核心问题是:固定长度数组[T; N]的Borsh反序列化要求泛型T实现Copy trait,而String是堆分配的动态类型,本身不实现Copy trait,因此[String; 3]无法通过Borsh反序列化的trait校验。

解决方案

有两种常用的方案可以解决这个问题:

  • 方案一:将固定长度的String数组替换为Vec<String>
    Borsh对Vec<T>的序列化/反序列化不需要T实现Copy trait,完全支持Vec<String>类型。如果你的业务逻辑要求token_uris固定为3个元素,只需要在程序的新增/修改逻辑中添加长度校验即可。
    改造后的结构体示例:

    #[derive(Clone, Debug, BorshSerialize, BorshDeserialize, PartialEq)]
    pub struct Box {
        pub token_uris: Vec<String>, 
        pub count: i32,
        pub title: String,
        pub description: String,
        pub image: String,
        pub price: i32,
        pub usd_price: i32,
        pub count_nft: i32,
        pub is_opened: bool,
    }
    

    校验逻辑示例(如果使用Anchor框架):

    require!(box_account.token_uris.len() == 3, ErrorCode::InvalidTokenUriCount);
    
  • 方案二:使用固定长度字节数组替代String
    这是Solana链上程序的更推荐实践,定长存储的成本更低、序列化速度更快,也完全规避了动态类型的trait约束问题。你可以根据业务场景给每个字符串字段设置合理的最大长度,用[u8; 最大长度]存储字符串内容,使用时再做UTF-8转换即可。
    改造后的结构体示例:

    // 预先定义各字符串字段的最大允许长度
    const MAX_URI_LEN: usize = 200;
    const MAX_TITLE_LEN: usize = 100;
    const MAX_DESC_LEN: usize = 500;
    const MAX_IMG_LEN: usize = 200;
    
    #[derive(Clone, Debug, BorshSerialize, BorshDeserialize, PartialEq)]
    pub struct Box {
        pub token_uris: [[u8; MAX_URI_LEN]; 3], 
        pub count: i32,
        pub title: [u8; MAX_TITLE_LEN],
        pub description: [u8; MAX_DESC_LEN],
        pub image: [u8; MAX_IMG_LEN],
        pub price: i32,
        pub usd_price: i32,
        pub count_nft: i32,
        pub is_opened: bool,
    }
    

    字节数组转String的示例:

    // 过滤掉补位的0字节后转换为String
    let title_str = String::from_utf8(
        box_account.title.iter().filter(|&&b| b != 0).cloned().collect()
    ).expect("Invalid UTF-8 string");
    

    存储时需要提前校验字符串长度不超过预设的最大长度,不足长度的位置补0即可。

内容的提问来源于stack exchange,提问作者Naveed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:06:03