【发布时间】:2022-09-23 15:26:16
【问题描述】:
我有一个特征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,但这没有帮助。
-
很难相信使用
\"rc\"你会得到精确的同样的错误信息。 -
@Finomnis 问题不在于
Arc,而是serde 在Mutex上有(隐式)Sized边界。我正在准备 PR。 -
有趣的是它完全有效(例如,
Box)。我的直觉会说你不能序列化dyn。但我猜你就是不能反序列化一个dyn。