首先我们来存一个简单的东西
比如一个age和一个name
#[repr(C)]
#[derive(Clone, BorshSerialize, BorshDeserialize, Debug)]
pub struct MonsterFeatureConfig {
pub age: u8,
pub name: String,
}
我们现在要存这个东西
很简单
就是一个u8的age
和一个string的name
那么我们需要多大的空间呢
u8的话是1
string的话是4+长度
比如我们要存“hello”
那么就是4加上这个字符串的长度5===9
所以我们这边的空间就给1+9===10
假设我们要存"helloworld"
字符串长度为10,再加上数据结构需要的空间4
10+4===14
如果是
age:u8
name:String
那么空间就是1+14===15
那么现在我们稍微复杂一点
#[repr(C)]
#[derive(Clone, BorshSerialize, BorshDeserialize, Debug)]
pub struct MonsterFeatureConfig {
pub age: u8,
pub name1: String,
pub name2: String,
}
如果是这样的2个string的属性
假设我们空间给了
1+(4+10)*2
也就是说,单个string给了14,那么string长度可以存放10
但是如果第一个string没有到10,那么第二个string的空间是紧跟着第一个string的
也就是说2个string的存储是连续的
并不会空出多余的空间
比如这样
Object {
"data": Object {
"data": Array [
2,
5,
0,
0,
0,
97,
98,
99,
100,
101,
5,
0,
0,
0,
97,
98,
99,
100,
101,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
],
"type": "Buffer",
},
"executable": false,
"lamports": 1092720,
所以一个方案就是把剩余的空间补齐
feature_config.age=2;
feature_config.name1 = String::from("abcde");
feature_config.name2 = String::from("abcde");
if feature_config.name1.len()<10 {
feature_config.name1 +=&String::from(" ");
}
if feature_config.name2.len()<10 {
feature_config.name2 +=&String::from(" ");
}
最后deserialize出来之后
console.log('=========================')
console.log(feature_config)
console.log(feature_config.name1);
console.log(feature_config.name2);
console.log(feature_config.name1.length)
console.log(feature_config.name2.length)
console.log(feature_config.name1.trim());
console.log(feature_config.name2.trim());
console.log(feature_config.name1.trim().length);
console.log(feature_config.name2.trim().length);
我们就是
Object {
"data": Object {
"data": Array [
2,
10,
0,
0,
0,
97,
98,
99,
100,
101,
32,
32,
32,
32,
32,
10,
0,
0,
0,
97,
98,
99,
100,
101,
32,
32,
32,
32,
32,
],
"type": "Buffer",
},
"executable": false,
"lamports": 1092720,
这样的
FeatureConfigAccount {
"age": 2,
"name1": "abcde ",
"name2": "abcde ",
}
abcde
abcde
10
10
abcde
abcde
5
5
说实话还是挺恶心的