文字サイズ
#[max_len(32)] が欠落している場合の問題は、シリアル化されたアカウントには 32 バイトにするために 0 バイトが埋め込まれた文字列が含まれているのに対し、逆シリアル化構造体は文字列が実際に長くなるまでのバイト数だけを逆シリアル化しようとし、残りの 0 バイトによって後続のフィールドの逆シリアル化が台無しになってしまうことです。
これを修正するには、declare_program を使用することをお勧めします。アンカークライアントから。そうすれば、同じ構造体を手動で実装する必要がなくなります。プログラムとクライアントを作成すると、デシリアライゼーションが無料で実装されます。この質問からコピー&ペーストします。
宣言プログラム!(私のプログラム);
my_program::{ID、アカウント::プロポーザル} を使用します。
アンカー_クライアント::クライアントを使用します。
let cl = Client::new_with_options(
クラスター、
料金支払者、
CommitmentConfig::confirmed()、
);
p = cl.program(ID).unwrap(); とします。
let acc_state: Proposal = p.account(<アカウントを指す公開キー>).await?;
ただし、これができない場合は、問題はバイト数が多すぎることであると述べたように、BorshDeserialize::deserialize を使用することをお勧めします。
Proposal::deserialize(&mut &data[..]).unwrap();
ただし、これにより、基になるバイト配列が残りのバイトを指すように変更されることに注意してください。同じバイトを他の目的で使用することはおそらくないので、これは問題ないと思いますが、参考までに。