在 Serde 中如何对 Arc<T> 进行序列化或反序列化?

41

我有一个包含其自身类型的子元素的结构体。这些子元素被封装在Arc中,当我调用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<db::queries::categories::Category>' 我尝试了几种不同的方法来实现序列化,例如:

#[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不使用创建内部的类型

我现在可能可以放弃反序列化,因为在这一点上,序列化更加重要。

1个回答

74

Serde 提供了对 Arc<T>Rc<T>SerializeDeserialize 实现,但仅在启用了 rc 特性时才可用。

Serde 的参考网站上有一条评论解释了为什么:

Opt into impls for Rc<T> and Arc<T>. Serializing and deserializing these types does not preserve identity and may result in multiple copies of the same data. Be sure that this is what you want before enabling this feature.

要启用 rc 特性,您需要在自己的 Cargo.toml 中请求它:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接