प्रश्न और उत्तर

रस्ट फ्रंटएंड में अकाउंट को मैं कैसे डीसेरियलाइज़ कर सकता हूँ?

पाठ आकार
#[max_len(32)] के गायब होने की समस्या यह है कि सीरियलाइज़ किए गए अकाउंट में एक स्ट्रिंग होती है जिसे 32 बाइट्स बनाने के लिए 0 बाइट्स से पैड किया जाता है, जबकि डीसीरियलाइज़ करने वाला स्ट्रक्चर केवल उतने ही बाइट्स को डीसीरियलाइज़ करने की कोशिश करता है जितनी लंबाई की आपकी स्ट्रिंग वास्तव में है और फिर शेष 0 बाइट्स अगले फ़ील्ड्स को डीसीरियलाइज़ करने में गड़बड़ कर देते हैं। इसे ठीक करने के लिए, मैं anchor_client से declare_program! का उपयोग करने की सलाह देता हूँ। इस तरह आपको अपने प्रोग्राम और क्लाइंट में एक ही स्ट्रक्चर को हाथ से लागू करने की आवश्यकता नहीं होगी और आपको मुफ्त में डीसीरियलाइज़ेशन लागू मिल जाएगा। इस प्रश्न से कॉपी-पेस्ट: 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(); ध्यान दें कि यह आपके अंतर्निहित बाइट ऐरे को शेष बाइट्स की ओर इंगित करने के लिए परिवर्तित कर देगा। मेरा अनुमान है कि यह ठीक है क्योंकि आप संभवतः उन्हीं बाइट्स का किसी और चीज़ के लिए उपयोग नहीं करेंगे, लेकिन बस एक सूचना के तौर पर।
खोजना जारी रखेंडेटा कैटलॉगखोज