我正在尝试使用Serde将共享引用保存到单个内存位置。我有一个小的结构体容器,其中包含两个类型为
是否可能向Serde指示ref0和ref1应该共享一个内存位置并且是“链接”的?
Arc<RwLock<f64>>
的属性。我的目标是让这两个属性共享一个内存位置,以便当我改变一个属性时,另一个属性也会改变。当容器在主函数中创建时,这个方法可行。但是当我加载序列化的结构体ref0和ref1时,它们不再共享相同的内存位置,并且包含具有相同值的唯一内存位置。是否可能向Serde指示ref0和ref1应该共享一个内存位置并且是“链接”的?
#[derive(Serialize, Deserialize)]
struct Container {
pub(crate) ref0: Arc<RwLock<f64>>,
pub(crate) ref1: Arc<RwLock<f64>>
}
保存场景(可行)
//makers ref0 and ref1, assign them to container.
let mut ref0 = Arc::new(RwLock::new(1.0));
let ref1 = ref0.clone();
let container = Container {
ref0,
ref1
};
// Checks that changing one ref will alter the other.
mem::replace(&mut *container.ref0.write().unwrap(), 2.0);
println!("{} {}",container.ref0.read().unwrap(), container.ref1.read().unwrap()); // should output "2.0 2.0" and does.
mem::replace(&mut *container.ref0.write().unwrap(), 3.0);
println!("{} {}",container.ref0.read().unwrap(), container.ref1.read().unwrap()); // should output "3.0 3.0" and does.
// Serializes the struct and save
let f_name = "SaveTest.test";
let mut file = File::create( f_name).unwrap();
let _result = file.write_all(&bincode::serialize(&container).unwrap());
加载场景(无法正常工作)
//LOAD THE CONTAINER
let mut buffer : Vec<u8> = vec![];
BufReader::new(File::open("SaveTest.test").unwrap()).read_to_end(&mut buffer).unwrap();
let container : Container = bincode::deserialize(&buffer).unwrap();
//Verifies that each ref is the same value when it was saved
println!("{} {}",container.ref0.read().unwrap(), container.ref1.read().unwrap()); // Should output "3.0 3.0" and does
mem::replace(&mut *container.ref0.write().unwrap(), 4.0);
println!("{} {}",container.ref0.read().unwrap(), container.ref1.read().unwrap()); // Should output "4.0 4.0" but outputs "4.0 3.0"