【发布时间】:2018-02-20 09:36:22
【问题描述】:
我想根据情况以两种不同的方式序列化结构,但我面临一个问题:根据我目前的知识,我只能以一种方式序列化结构。
这是我的代码#[derive(Serialize)](自动派生)
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct TransactionContent {
sender_addr: Vec<u8>,
sender_pubkey: Vec<u8>,
receiver_addr: Vec<u8>,
amount: u32,
timestamp: i64
}
我正在使用bincode::serialize 序列化我的结构并使其成为Vec<u8>,并且我也想将该结构存储在 JSON 文件中。在序列化为 JSON 时,我想以我自己的方式对其进行序列化,例如为 Vec<u8> 字段返回一个 base58 字符串。
这是我自己的实现:
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()
}
}
我不能同时使用上面的代码。如果我使用自动派生,第二个Impl 是不可能的。如果我使用第二个,bincode::serialize 函数将起作用,但不是我想要的(我想使用Vec<u8>)
有没有一种方法可以同时使用Impl?比如有条件的Impl?
【问题讨论】:
-
你可以为包装器
struct TransactionContentBase58(TransactionContent);实现不同的序列化。它能解决你的问题吗?
标签: serialization struct rust