【问题标题】:How to Serialize Arc<Mutex<T>> in Rust?如何在 Rust 中序列化 Arc<Mutex<T>>?
【发布时间】: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&lt;Mutex&lt;&gt;&gt;。但是Arc&lt;Mutex&lt;&gt;&gt;编译器抱怨:

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

标签: rust serde


【解决方案1】:

更新:从 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 功能。

【讨论】:

  • 谢谢!这可能是另一个问题,但erased_serde 的功能似乎与我的用例密切相关,但是我不知道使用它有什么好处。 erased_serde 在我的情况下有用吗?
  • @AnatolyBugakov No. erased-serde 允许您使用 dyn Serialize,但您不需要。
猜你喜欢
  • 2018-08-25
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2011-02-10
  • 2011-06-27
  • 1970-01-01
相关资源
最近更新 更多