Как указано в Выпуск Serde 194 , недостатками реализации десериализации до Rc
или Arc
являются:
- Потенциально повышенное использование памяти
- Сравнение равенства, которое основано на сравнении разрывов адресов
- Изменчивость внутренней части не отражается в копиях
Это отражено в документации о флаге функции :
Сериализация не будет пытаться дедуплицировать эти повторяющиеся данные.
Десериализация структуры данных, содержащей указатели с подсчетом ссылок, не будет пытаться дедуплицировать ссылки на те же данные.
Обычная точка для Rc
или Arc
- доля данных. Такое совместное использование не происходит при десериализации структуры, содержащей Rc
или Arc
. В этом примере 5 совершенно разных Rc<str>
создаются без отношения друг к другу, даже если все они имеют одинаковое содержимое:
use std::{rc::Rc, ptr};
fn main() {
let json = r#"[
"alpha",
"alpha",
"alpha",
"alpha",
"alpha"
]"#;
let strings = serde_json::from_str::<Vec<Rc<str>>>(json).unwrap();
dbg!(ptr::eq(strings[0].as_ref(), strings[1].as_ref()));
}
[src/main.rs:14] ptr::eq(strings[0].as_ref(), strings[1].as_ref()) = false
Это особенно плохо, если у вас есть Rc<RefCell<_>>
или другой тип с изменчивостью внутренней части, поскольку можно ожидать, что изменение одного из элементов изменяет всех элементов.
См. Также: