请解释Serde rc
功能
为什么存在此功能标志,为什么它不是默认行为?这是什么意思
我知道它与 Serde issue 194 相关。 last message of the issue 说
是否存在用于捕获 Rc
结构的意外用法的功能标志?
最佳答案
如 Serde issue 194 所述,反序列化为 Rc
或 Arc
的实现的缺点是:
这在 feature flag documentation 中得到了回应:
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<_>>
或其他具有内部可变性的类型时,这尤其糟糕,因为您可能期望修改其中一个项目会修改所有项目。也可以看看:
关于rust - 为什么 Serde 默认不支持 Rc 和 Arc 类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60604346/