This code works:
use serde::{Deserialize, Serialize};
use std::sync::{RwLock, Arc};
use ron;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
struct Foo {
first: u8,
second: u16,
}
fn main() {
let foo = Foo {first: 1, second: 2};
let lock = Arc::new(RwLock::new(foo));
let state = lock.read().unwrap().clone(); // FIXME: remove clone()
let string = ron::ser::to_string(&state).unwrap();
println!("{}", string);
}
I want to get rid of the .clone()
as foo
in my program is 100MB+, and I need to take this reference many times.
When I get rid of .clone()
I get the error:
error[E0277]: the trait bound `std::sync::RwLockReadGuard<'_, Foo>: _::_serde::Serialize` is not satisfied
--> src/bin/sandbox7.rs:16:35
|
16 | let string = ron::ser::to_string(&state).unwrap();
| ^^^^^^ the trait `_::_serde::Serialize` is not implemented for `std::sync::RwLockReadGuard<'_, Foo>`
|
::: /home/chris/.cargo/registry/src/github.com-1ecc6299db9ec823/ron-0.6.0/src/ser/mod.rs:25:8
|
25 | T: Serialize,
| --------- required by this bound in `ron::ser::to_string`
I want to serialise foo
(from another thread, in the real code, hence the Arc).
How can I get an &Foo
from lock
, without the wasteful .clone()
?
RWLockReadGuard
derefs to the underlying type.
There's no ron
in playground so I can not check for sure, but this should do the trick:
let state = lock.read().unwrap();
let string = ron::ser::to_string(&*state).unwrap();