我有一个 struct ,它包含自己类型的子 struct .这些子元素被Arc个包裹着,我打serde_json::to_string的时候遇到了问题.我的 struct 是:

#[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>'我try 了几种不同的方法来实现序列化,例如:

#[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的误差

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

推荐答案

Serde为Arc<T>Rc<T>提供SerializeDeserialize的实现,但前提是启用了rc功能.

有一条关于Serde's reference website的 comments 解释了原因:

Select Rc<T>Arc<T>的impls.序列化和反序列化这些类型不会保留标识,可能会导致相同数据的多个副本.在启用此功能之前,请确保这是您想要的.

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

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

Rust相关问答推荐

WebDriver等待三十四?(Rust Se)

如何从使用mockall模拟的方法中返回self?

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

Rust中的相互递归特性与默认实现

展开枚举变量并返回所属值或引用

在自身功能上实现类似移动的行为,以允许通过大小的所有者进行呼叫(&;mut;self)?

使用Box优化可选的已知长度数组的内存分配

创建Rust中元对象协议的动态对象 Select /重新分配机制

铁 rust ,我的模块介绍突然遇到了一个问题

有没有可能让泛型Rust T总是堆分配的?

在文件链实施中绕过borrow 判断器

无法实现整型类型的泛型FN

减少指示ProgressBar在Rust中的开销

&'a T 是否意味着 T: 'a?

如何使用 Bincode 在 Rust 中序列化 Enum,同时保留 Enum 判别式而不是索引?

如何将 C++ 程序链接到 Rust 程序,然后将该 Rust 程序链接回 C++ 程序? (cpp -> rust -> cpp)

如何在 Rust 中将枚举变体转换为 u8?

第 7.4 章片段中如何定义 `thread_rng`

我如何将 google_gmail1::Gmail> 传递给线程生成?

当用作函数参数时,不强制执行与绑定的关联类型