คำถามและคำตอบ

ฉันจะดีซีเรียลไลซ์บัญชีใน Rust frontend ได้อย่างไร

ขนาดข้อความ
ปัญหาเกี่ยวกับ #[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 ต้นทางของคุณให้ชี้ไปยังไบต์ที่เหลือ ผมเดาว่านี่น่าจะโอเคเพราะคุณคงไม่ใช้ไบต์เหล่านั้นทำอย่างอื่นอีก แต่แจ้งไว้เป็นข้อมูลเฉย ๆ