எழுத்து அளவு
#[max_len(32)] இல்லாததால் ஏற்படும் பிரச்சினை என்னவென்றால், serialized கணக்கில் 32 பைட்டுகளை நிரப்ப 0 பைட்டுகளால் padding செய்யப்பட்ட ஒரு string உள்ளது, ஆனால் deserializing struct உங்கள் string உண்மையில் எத்தனை பைட்டுகள் நீளமோ அத்தனை பைட்டுகளை மட்டுமே deserialize செய்ய முயற்சிக்கிறது, பின்னர் மீதமுள்ள 0 பைட்டுகள் அடுத்த fields-ஐ deserialize செய்வதை குழப்புகின்றன.
இதை சரிசெய்ய, anchor_client-இலிருந்து declare_program!-ஐ பயன்படுத்த பரிந்துரைக்கிறேன். அப்படியானால் உங்கள் program மற்றும் client-இல் அதே struct-ஐ கையால் implement செய்ய தேவையில்லை, மேலும் deserialization உங்களுக்காக இலவசமாக implement செய்யப்படும். இந்த கேள்வியிலிருந்து copy paste:
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();
இருப்பினும் இது உங்கள் அடிப்படை byte array-ஐ மீதமுள்ள பைட்டுகளை நோக்கி mutate செய்யும் என்பதை கவனிக்கவும். நீங்கள் அதே பைட்டுகளை வேறு எதற்கும் பயன்படுத்த மாட்டீர்கள் என நினைக்கிறேன், எனவே இது பரவாயில்லை, ஆனால் ஒரு தகவலுக்காக மட்டும் சொல்கிறேன்.