ขนาดข้อความ
ปัญหาเกี่ยวกับ #[max_len(32)] ที่หายไปคือบัญชีที่ถูก serialize มีสตริงที่เติม 0 ไบต์เพื่อให้ครบ 32 ไบต์ ในขณะที่ struct ที่ทำ deserialize พยายาม deserialize เพียงเท่าความยาวจริงของสตริงของคุณ แล้วไบต์ 0 ที่เหลือจะทำให้การ deserialize ฟิลด์ถัดไปผิดพลาด
เพื่อแก้ปัญหานี้ ผมแนะนำให้ใช้ declare_program! จาก anchor_client วิธีนี้คุณไม่จำเป็นต้อง implement struct เดียวกันด้วยมือทั้งในโปรแกรมและไคลเอนต์ของคุณ และคุณจะได้การ deserialization ที่ implement มาให้ฟรี คัดลอกจากคำถามนี้:
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();
โปรดทราบว่าสิ่งนี้จะ mutate byte array ต้นทางของคุณให้ชี้ไปยังไบต์ที่เหลือ ผมเดาว่านี่น่าจะโอเคเพราะคุณคงไม่ใช้ไบต์เหล่านั้นทำอย่างอื่นอีก แต่แจ้งไว้เป็นข้อมูลเฉย ๆ