【问题标题】:How do I serialize or deserialize an Arc<T> in Serde?如何在 Serde 中序列化或反序列化 Arc<T>?
【发布时间】:2018-08-25 00:57:48
【问题描述】:

我有一个包含自己类型的孩子的结构。这些孩子被包裹在Arcs 中,我在调用serde_json::to_string 时遇到了问题。我的结构是:

#[derive(Serialize, Deserialize)]
pub struct Category {
    pub id: i32,
    pub name: String,
    pub parent_id: i32,
    pub children: Vec<Arc<Category>>,
}

这会产生错误the trait 'serde::Serialize' is not implemented for 'std::sync::Arc&lt;db::queries::categories::Category&gt;' 我尝试了几种不同的方法来使序列化工作,例如:

#[serde(serialize_with = "arc_category_vec")]
pub children: Vec<Arc<Category>>
fn arc_category_vec<S>(value: &Vec<Arc<Category>>, serializer: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    let mut seq = serializer.serialize_seq(Some(value.len()))?;
    for e in value {
        seq.serialize_element(e.as_ref())?;
    }
    seq.end()
}

这无济于事,因为我遇到了同样的错误。我也试过了:

impl Serialize for Arc<Category> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let mut state = serializer.serialize_struct("Category", 4)?;

        state.serialize_field("id", &self.id)?;
        state.serialize_field("name", &self.name)?;
        state.serialize_field("parent_id", &self.parent_id)?;
        state.serialize_field("children", &self.children)?;
        state.end();
    }
}

但这给出了错误impl doesn't use types inside crate

我可能不需要反序列化,因为序列化在这一点上更重要。

【问题讨论】:

    标签: rust serde


    【解决方案1】:

    Serde 为 Arc&lt;T&gt;Rc&lt;T&gt; 提供了 SerializeDeserialize 的实现,但前提是启用了 rc 功能。

    Serde's reference website 上有评论解释原因:

    选择使用 Rc&lt;T&gt;Arc&lt;T&gt; 的 impls。序列化和反序列化这些类型不会保留身份,并且可能导致相同数据的多个副本。在启用此功能之前,请确保这是您想要的。

    要启用rc 功能,您需要在自己的Cargo.toml 中申请:

    [dependencies]
    serde = { version = "1.0", features = ["rc"] }
    

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多