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()
    }
}