snippetrustMajor
How do I serialize or deserialize an Arc<T> in Serde?
Viewed 0 times
deserializehowarcserdeserialize
Problem
I have a struct that contains children of its own type. These children are wrapped in
This produces the error
This doesn't help as I get the same error. I also tried:
but that gives the error
I could probably live without deserialization, since serialization is more important at this point.
Arcs, and I'm getting issues when calling serde_json::to_string on it. My struct is:#[derive(Serialize, Deserialize)]
pub struct Category {
pub id: i32,
pub name: String,
pub parent_id: i32,
pub children: Vec>,
}This produces the error
the trait 'serde::Serialize' is not implemented for 'std::sync::Arc' I've tried a few different approaches to get serialization working, such as:#[serde(serialize_with = "arc_category_vec")]
pub children: Vec>fn arc_category_vec(value: &Vec>, serializer: S) -> Result
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(value.len()))?;
for e in value {
seq.serialize_element(e.as_ref())?;
}
seq.end()
}This doesn't help as I get the same error. I also tried:
impl Serialize for Arc {
fn serialize(&self, serializer: S) -> Result
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();
}
}but that gives the error
impl doesn't use types inside crateI could probably live without deserialization, since serialization is more important at this point.
Solution
Serde provides implementations of
There's a comment on Serde's reference website explaining why:
Opt into impls for
To enable the
Serialize and Deserialize for Arc and Rc, but only if the rc feature is enabled.There's a comment on Serde's reference website explaining why:
Opt into impls for
Rc and Arc. 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.To enable the
rc feature, you need to ask for it in your own Cargo.toml:[dependencies]
serde = { version = "1.0", features = ["rc"] }Code Snippets
[dependencies]
serde = { version = "1.0", features = ["rc"] }Context
Stack Overflow Q#49312600, score: 99
Revisions (0)
No revisions yet.