#[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