gpt4 book ai didi

serialization - 我可以为单个结构以不同的方式多次实现相同的特征吗?

转载 作者:行者123 更新时间:2023-11-29 08:14:19 25 4
gpt4 key购买 nike

我想根据情况以两种不同的方式序列化结构,但我遇到了一个问题:根据我目前的知识,我只能以一种方式序列化结构。

这是我的代码 #[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例如?

最佳答案

不,您不能为一个类型以多种方式多次实现相同的特征。

作为mentioned in a comment ,您可以创建一个新类型来包装完整数据并在其上实现所需的特征:

use serde::{ser::SerializeStruct, Serialize, Serializer}; // 1.0.117
use serde_json; // 1.0.59

#[derive(Debug, Serialize)]
struct Real {
data: Vec<u8>,
}

struct AsJson<'a>(&'a Real);

impl<'a> Serialize for AsJson<'a> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("Thing", 1)?;
state.serialize_field("data", b"this is some data")?;
state.end()
}
}

fn main() {
let r = Real {
data: vec![1, 2, 3, 4],
};
println!("{:?}", serde_json::to_string(&r));
println!("{:?}", serde_json::to_string(&AsJson(&r)));
}

如果你控制特质

您可以向特征添加一个通用参数,并为同一类型多次实现它:

trait Example<T> {}

struct Style1;
struct Style2;

impl Example<Style1> for i32 {}
impl Example<Style2> for i32 {}

但这并非没有缺点。

另见:

关于serialization - 我可以为单个结构以不同的方式多次实现相同的特征吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46167642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com