اندازه متن
مشکل نبودن #[max_len(32)] این است که حساب سریالایز شده شامل یک رشته است که با بایتهای 0 تا 32 بایت پر شده، در حالی که ساختار دیسریالایز کننده تلاش میکند فقط به اندازه طول واقعی رشته شما بایت دیسریالایز کند و سپس بایتهای 0 باقیمانده دیسریالایز کردن فیلدهای بعدی را خراب میکنند.
برای رفع این مشکل، توصیه میکنم از declare_program! از anchor_client استفاده کنید. به این ترتیب نیازی نیست همان ساختار را به صورت دستی در برنامه و کلاینت خود پیادهسازی کنید و دیسریالایز کردن به صورت رایگان برای شما پیادهسازی میشود. کپی پیست از این سوال:
declare_program!(my_program);
use my_program::{ID, accounts::Proposal};
use anchor_client::Client;
let cl = Client::new_with_options(
cluster,
fee_payer,
CommitmentConfig::confirmed(),
);
let p = cl.program(ID).unwrap();
let acc_state: Proposal = p.account().await?;
اگر نمیتوانید این کار را انجام دهید، توصیه میکنم از BorshDeserialize::deserialize استفاده کنید زیرا همانطور که گفتم مشکل شما داشتن بایتهای بیش از حد است.
Proposal::deserialize(&mut &data[..]).unwrap();
توجه داشته باشید که این کار آرایه بایت زیرین شما را تغییر میدهد تا به بایتهای باقیمانده اشاره کند. حدس میزنم این مشکلی ندارد زیرا احتمالاً از همان بایتها برای چیز دیگری استفاده نمیکنید، اما فقط به عنوان اطلاع.