వచన పరిమాణం
#[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();
ఇది మీ అంతర్లీన బైట్ అర్రేను మిగిలిన బైట్ల వైపు చూపేలా మ్యూటేట్ చేస్తుందని గమనించండి. మీరు బహుశా ఆ అదే బైట్లను వేరే దేనికీ ఉపయోగించరు కాబట్టి ఇది సరిపోతుందని నేను ఊహిస్తున్నాను, కానీ కేవలం తెలియజేయడానికి మాత్రమే.