Я замечаю, что когда пытаюсь использовать Borsh для сериализации / десериализации, я получаю ошибки

Здравствуйте, вопрос по сериализации. Я замечаю, что когда я пытаюсь использовать Borsh для сериализации / десериализации, я получаю ошибки, когда размеры данных не совпадают. Например, если у меня есть массив в данных учетной записи, а затем я пытаюсь добавить еще один элемент. Если у меня еще нет элемента данных-заполнителей с фиктивными значениями в полях, попытка сериализации не удастся. Я что-то делаю не так, или это так, и я просто должен с этим смириться?

1 ответ

Если вы передаете &[u8] данных в try_from_slice, но общий размер данных учетной записи больше, чем ваши данные, вы получите эту ошибку, поскольку по умолчанию выполняется проверка десериализованной длины с общей длиной среза (или что-то в этом роде):

  • Захватите фактический размер данных, которые вы храните, взяв .len() вывода try_to_vec() и запишите его в блок данных учетной записи, а затем сохраните свои данные. При десериализации используйте сохраненное значение len и используйте его для создания фрагмента этого размера из данных учетной записи для передачи в try_from_slice. Вы можете увидеть пример (с использованием BTreeMap вместо вашего массива, но вы поняли идею) здесь https://github.com/hashblock/solana-cli-program-template/blob/main/program/src/account_state.rs по адресу L66 (сериализация) и L85 (десериализация).
Другие вопросы по тегам