我有一个包含其自身类型的子元素的结构体。这些子元素被封装在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不使用创建内部的类型
我现在可能可以放弃反序列化,因为在这一点上,序列化更加重要。