我注意到当我尝试使用 Borsh 进行序列化/反序列化时会出错

Posted

技术标签:

【中文标题】我注意到当我尝试使用 Borsh 进行序列化/反序列化时会出错【英文标题】:I notice when I try and use Borsh to serialize/deserialize I'll get errors 【发布时间】:2021-09-08 10:55:01 【问题描述】:

我注意到,当我尝试使用 Borsh 进行序列化/反序列化时,当数据大小不匹配时会出现错误。例如,如果我在帐户数据中有一个数组,然后我去尝试添加另一个元素。如果我还没有占位符数据项,并且字段中有虚拟值,则序列化尝试将失败。是我做错了什么,还是事情就是这样,我只能接受?

【问题讨论】:

【参考方案1】:

如果您将数据的 &[u8] 传递给 try_from_slice 但整体帐户数据大小大于您的数据,您将收到 borsh 错误,因为它默认检查反序列化长度与整体切片长度(或其他像这样):

通过获取 try_to_vec() 输出的 .len() 来捕获您正在存储的数据的实际大小,并将其写入帐户数据块,然后存储您的数据。当您反序列化时,使用存储的 len 并使用它从帐户数据创建一个该大小的切片,以传递给 try_from_slice。您可以在 L66(序列化)和 L85(反序列化)的 https://github.com/hashblock/solana-cli-program-template/blob/main/program/src/account_state.rs 处看到一个示例(使用 BTreeMap 而不是您的数组,但您明白了)。

【讨论】:

用于序列化github.com/hashblock/solana-cli-program-template/blob/… 和反序列化github.com/hashblock/solana-cli-program-template/blob/… 的永久链接这似乎令人痛苦地手动......我如何才能以一种“正常工作”的方式调用borshdeserialize,并从u8 vec 中补充我的锈类型?仍在阅读/试验,但还没有找到解决此问题的现有技术

以上是关于我注意到当我尝试使用 Borsh 进行序列化/反序列化时会出错的主要内容,如果未能解决你的问题,请参考以下文章

ServiceStack JsonSerializer 不序列化公共成员

使用 redux 工具包时出现错误“在状态中检测到不可序列化的值” - 但不是正常的 redux

在 Qt 中启动单独的进程

Json.Net 两次没有以相同的方式序列化小数

具体化:自动完成输入将内容向下移动

learning java 实例序列化