मुख्य सामग्री पर जाएं
iCute Financeडिजिटल परिसंपत्तियाँ · बाज़ार अवलोकन
हिन्दी
शोध निर्देशिका
iCute Finance

प्राथमिक नेविगेशन

प्राथमिक नेविगेशन

डिजिटल परिसंपत्तियाँ · बाज़ार अवलोकन

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

#[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(<Pubkey pointing to the account>).await?;

हालाँकि, अगर आप ऐसा नहीं कर सकते, तो मैं BorshDeserialize::deserialize का उपयोग करने की सलाह दूँगा क्योंकि जैसा मैंने कहा आपकी समस्या बहुत अधिक बाइट्स होने की है। Proposal::deserialize(&mut &data[..]).unwrap();

ध्यान दें कि यह आपके अंतर्निहित बाइट ऐरे को शेष बाइट्स की ओर इंगित करने के लिए परिवर्तित कर देगा। मेरा अनुमान है कि यह ठीक है क्योंकि आप संभवतः उन्हीं बाइट्स का किसी और चीज़ के लिए उपयोग नहीं करेंगे, लेकिन बस एक सूचना के तौर पर।

स्रोत देखें CC BY-SA 4.0