gpt4 book ai didi

rust - 如何在 Rust 中序列化 Arc>?

转载 作者:行者123 更新时间:2023-12-02 15:47:02 24 4
gpt4 key购买 nike

我有一个特质 DataSet ,为此我实现了 Serialize像这样:

impl Serialize for dyn DataSet {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_map(Some(2))?;
seq.serialize_entry("fields", "Hello")?;
seq.serialize_entry("measures", "There")?;
seq.end()
}
}

现在,在程序/应用程序中我共享指向特征对象的指针:

let x: Arc<Mutex<dyn DataSet>> = Arc::new(Mutex::new(data));

在哪里data是实现 DataSet 的任何对象。

现在,我想把这个对象转成json(即序列化):

serde_json::to_string(&x)

适用于 Box而不是 Arc<Mutex<>> .但是用Arc<Mutex<>>编译器提示:

the size for values of type `dyn base_engine::DataSet` cannot be known at compilation time
the trait `Sized` is not implemented for `dyn base_engine::DataSet`
the trait `Serialize` is implemented for `Arc<T>`
required because of the requirements on the impl of `Serialize` for `Mutex<dyn base_engine::DataSet>`

我尝试添加功能 ["rc"] serde,但这没有帮助。

最佳答案

更新:自 serde 1.0.145 起此代码有效。


原答案:

Serde 不支持序列化未确定类型的 MutexI sent a PR to relax this , 但与此同时你可以使用一个新类型:

pub struct MutexWrapper<T: ?Sized>(pub Mutex<T>);

impl<T: ?Sized + Serialize> Serialize for MutexWrapper<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.0
.lock()
.expect("mutex is poisoned")
.serialize(serializer)
}
}

let x: Arc<MutexWrapper<dyn DataSet>> = Arc::new(MutexWrapper(Mutex::new(data)));

当然,你还需要启用serderc特性。

关于rust - 如何在 Rust 中序列化 Arc<Mutex<T>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73806798/

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