Размер текста
Проблема с отсутствующим #[max_len(32)] заключается в том, что сериализованная учетная запись содержит строку, дополненную 0 байтами, чтобы получить 32 байта, тогда как структура десериализации пытается десериализовать только столько байтов, сколько на самом деле имеет длина вашей строки, а затем оставшиеся 0 байтов портят ее для десериализации следующих полей.
Чтобы это исправить, я рекомендую использовать Declare_program! из якоря_клиента. Таким образом, вам не нужно реализовывать одну и ту же структуру вручную.вашу программу и клиент, и вы получите реализацию десериализации бесплатно. Скопируйте вставку из этого вопроса:
объявить_программу!(моя_программа);
используйте my_program::{ID, account::Proposal};
используйте привязку_клиент::Клиент;
let cl = Client::new_with_options(
кластер,
плата_плательщик,
CommitmentConfig::confirmed(),
);
пусть p = cl.program(ID).unwrap();
let acc_state: Proposal = p.account().await?;
Если вы не можете этого сделать, я бы рекомендовал использовать BorshDeserialize::deserialize, как я уже сказал, ваша проблема в слишком большом количестве байтов.
Предложение::deserialize(&mut &data[..]).unwrap();
Обратите внимание, что это приведет к изменению вашего базового массива байтов, чтобы он указывал на оставшиеся байты. Я думаю, это нормально, поскольку вы, вероятно, не будете использовать те же байты ни для чего другого, а просто для справки.