Rust序列化库serde-cw-value的使用:高效处理CosmWasm智能合约数据的序列化与反序列化
Rust序列化库serde-cw-value的使用:高效处理CosmWasm智能合约数据的序列化与反序列化
serde-cw-value
提供了一种捕获序列化值树以便后续处理的方式。该库专门设计用于与CosmWasm智能合约一起工作,特别是当处理任何浮点类型时会提前报错。
安装
在项目目录中运行以下Cargo命令:
cargo add serde-cw-value
或者在Cargo.toml中添加以下行:
serde-cw-value = "0.7.0"
示例使用
以下是一个完整的示例,展示如何使用serde-cw-value
进行序列化和反序列化操作:
use serde::{Serialize, Deserialize};
use serde_cw_value::Value;
#[derive(Serialize, Deserialize, Debug)]
struct ContractData {
sender: String,
amount: u64,
recipients: Vec<String>,
}
fn main() {
// 原始数据
let data = ContractData {
sender: "cosmos1xyz...".to_string(),
amount: 1000,
recipients: vec![
"cosmos1abc...".to_string(),
"cosmos1def...".to_string()
],
};
// 序列化为Value
let value = serde_cw_value::to_value(&data).unwrap();
println!("Serialized Value: {:?}", value);
// 从Value反序列化
let deserialized: ContractData = serde_cw_value::from_value(value).unwrap();
println!("Deserialized: {:?}", deserialized);
// 尝试序列化包含浮点数的数据会报错
#[derive(Serialize)]
struct InvalidData {
value: f64,
}
let invalid = InvalidData { value: 3.14 };
let result = serde_cw_value::to_value(&invalid);
println!("Attempt to serialize float: {:?}", result);
// 会返回Err,因为浮点数在CosmWasm中不支持
}
主要特点
- 专为CosmWasm设计 - 特别处理CosmWasm智能合约的数据格式要求
- 浮点数处理 - 提前报错机制防止浮点数被意外使用
- 值树捕获 - 可以捕获完整的序列化值树进行后续处理
- 兼容性 - 与标准serde库兼容,可以轻松集成到现有代码中
完整示例
以下是基于上述示例扩展的更完整demo,展示了更多功能:
use serde::{Serialize, Deserialize};
use serde_cw_value::{Value, to_value, from_value};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct User {
address: String,
balance: u64,
is_active: bool,
permissions: Vec<String>,
}
#[derive(Serialize, Deserialize, Debug)]
struct Transaction {
from: String,
to: String,
amount: u64,
memo: Option<String>,
}
fn main() {
// 示例1: 基本结构体序列化
let user = User {
address: "cosmos1user...".to_string(),
balance: 5000,
is_active: true,
permissions: vec!["transfer".to_string(), "vote".to_string()],
};
let user_value = to_value(&user).unwrap();
println!("User Value: {:?}", user_value);
// 示例2: 包含Option类型的结构体
let tx = Transaction {
from: "cosmos1sender...".to_string(),
to: "cosmos1receiver...".to_string(),
amount: 100,
memo: Some("Test transaction".to_string()),
};
let tx_value = to_value(&tx).unwrap();
println!("Transaction Value: {:?}", tx_value);
// 示例3: 修改Value后再反序列化
if let Value::Map(mut map) = user_value {
// 修改balance字段
map.insert(Value::String("balance".to_string()), Value::U64(6000));
let modified_user: User = from_value(Value::Map(map)).unwrap();
println!("Modified User: {:?}", modified_user);
}
// 示例4: 处理错误情况
let invalid = Value::F64(3.14);
let result: Result<User, _> = from_value(invalid);
println!("Attempt to deserialize float: {:?}", result);
// 输出: Err(Error("floating point numbers are not supported in CosmWasm")
}
注意事项
- 该库不支持浮点数,任何包含f32/f64类型的序列化尝试都会失败
- 支持所有CosmWasm标准类型,包括String、u64、bool、Vec、Map等
- 可以先用to_value序列化为Value,修改后再用from_value反序列化
- 与标准serde库配合使用时需要确保数据结构实现了Serialize和Deserialize trait
1 回复