Serialization 我可以为一个结构以不同的方式多次实现相同的特性吗?
我想根据情况以两种不同的方式序列化结构,但我面临一个问题:根据我目前的知识,我只能以一种方式序列化结构 这是我的代码和Serialization 我可以为一个结构以不同的方式多次实现相同的特性吗?,serialization,struct,rust,Serialization,Struct,Rust,我想根据情况以两种不同的方式序列化结构,但我面临一个问题:根据我目前的知识,我只能以一种方式序列化结构 这是我的代码和#[派生(序列化)](自动派生) 我不能同时使用上面的代码。如果使用自动派生,则第二个Impl是不可能的。如果我使用第二个函数,则bincode::serialize函数将正常工作,但不是我希望的那样(我希望使用Vec) 有没有一种方法可以同时使用Impl?例如,像条件的Impl之类的东西?不,对于一个类型,不能以多种方式多次实现同一特性 您可以创建一个新类型来包装完整的数据,并
#[派生(序列化)]
(自动派生)
我不能同时使用上面的代码。如果使用自动派生,则第二个Impl
是不可能的。如果我使用第二个函数,则bincode::serialize
函数将正常工作,但不是我希望的那样(我希望使用Vec
)
有没有一种方法可以同时使用
Impl
?例如,像条件的Impl
之类的东西?不,对于一个类型,不能以多种方式多次实现同一特性
您可以创建一个新类型来包装完整的数据,并在该类型上实现所需的特征:
使用serde::{ser::SerializeStruct,Serialize,Serializer};//1.0.117
使用serde_json;//1.0.59
#[派生(调试、序列化)]
结构真实{
资料来源:Vec,
}
结构AsJson{
fn序列化(&self,序列化程序:S)->结果
哪里
S:序列化程序,
{
让mut state=serializer.serialize_struct(“Thing”,1)?;
state.serialize_字段(“数据”,b“这是一些数据”)?;
state.end()
}
}
fn main(){
设r=Real{
数据:vec![1,2,3,4],
};
println!(“{:?}”,serde_json::to_string(&r));
println!(“{:?}”,serde_json::to_string(&AsJson(&r));
}
如果你能控制这种特质
您可以向trait添加泛型参数,并为同一类型多次实现它:
trait示例{}
结构样式1;
结构样式2;
i32{}的impl示例
i32{}的impl示例
不过,这并非没有坏处
另见:
结构TransactionContentBase58(TransactionContent)实现不同的序列化代码>。这能解决你的问题吗?我明白了。优雅的谢谢你的回答。
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct TransactionContent {
sender_addr: Vec<u8>,
sender_pubkey: Vec<u8>,
receiver_addr: Vec<u8>,
amount: u32,
timestamp: i64
}
impl Serialize for TransactionContent {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer
{
let mut state = serializer.serialize_struct("TransactionContent", 5)?;
state.serialize_field("sender_addr", &self.sender_addr.to_base58())?;
state.serialize_field("sender_pubkey", &self.sender_pubkey.to_base58())?;
state.serialize_field("receiver_addr", &self.receiver_addr.to_base58())?;
state.serialize_field("amount", &self.amount)?;
state.serialize_field("timestamp", &self.timestamp)?;
state.end()
}
}