代码之家  ›  专栏  ›  技术社区  ›  dempzorz

如何在Serde中序列化或反序列化Arc?

  •  23
  • dempzorz  · 技术社区  · 8 年前

    我有一个结构,它包含自己类型的子结构。这些孩子 Arc s、 我打电话时遇到问题 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 doesn't use types inside crate

    我可能不需要反序列化,因为此时序列化更重要。

    1 回复  |  直到 8 年前
        1
  •  44
  •   E_net4 Tunn    8 年前

    Serde提供了 Serialize 和 Deserialize 对于 Arc<T> 和 Rc<T> ,但仅当 rc 功能已启用。

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

    选择impls for 钢筋混凝土(&L);T> 和 弧形(<);T> . 序列化和反序列化这些类型不会保留标识,可能会导致相同数据的多个副本。在启用此功能之前,请确保这是您想要的。

    要启用 钢筋混凝土 功能,您需要在自己的 Cargo.toml :

    [dependencies]
    serde = { version = "1.0", features = ["rc"] }
    
    推荐文章