我有一个trait叫做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()
}
}
现在,在程序/应用中,我正在共享指向trait对象的指针:
let x: Arc<Mutex<dyn DataSet>> = Arc::new(Mutex::new(data));
其中data
是任何实现了DataSet的对象。
现在,我想将这个对象转换为json(即序列化它):
serde_json::to_string(&x)
对于Box
而言可以正常工作,但是使用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中,但这并没有帮助。
Arc
,而是 serde 对Mutex
有(隐式)Sized
约束。我正在准备一份 PR。 - Chayim FriedmanBox
)。我的直觉会说你不能序列化一个dyn
。但我猜你只是不能反序列化一个dyn
。 - Finomnis