Could someone please point out what I am doing wrong? I want to implement serde capability for a struct with an AtomicPtr. I get the following error when I test it (I use bincode).
panicked at 'called Result::unwrap()
on an Err
value: Custom("invalid u8 while decoding bool, expected 0 or 1, found 48")'
#[derive(Serialize, Deserialize)]
struct A {
#[serde(serialize_with = "freeze", deserialize_with = "defreeze")]
datum: AtomicPtr<bool>,
}
impl A {
fn new() -> Self {
let v = Box::into_raw(Box::new(true));
return Self {
datum: AtomicPtr::new(v),
};
}
fn value(&self) -> bool {
let value = self.datum.load(Ordering::SeqCst);
let value = unsafe { Box::from_raw(value) };
return *value;
}
}
fn freeze<S>(v: &AtomicPtr<bool>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let value = v.load(Ordering::SeqCst);
let value = unsafe { Box::from_raw(value) };
(*value).serialize(serializer)
}
pub fn defreeze<'de, D>(deserializer: D) -> Result<AtomicPtr<bool>, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::Error;
let res = bool::deserialize(deserializer)
.and_then(|value| {
let v = Box::into_raw(Box::new(value));
Ok(AtomicPtr::new(v))
})
.map_err(|err| Error::custom(err.to_string()));
return res;
}