请解释Serde rc 功能



为什么存在此功能标志,为什么它不是默认行为?这是什么意思



我知道它与 Serde issue 194 相关。 last message of the issue



是否存在用于捕获 Rc 结构的意外用法的功能标志?

最佳答案

Serde issue 194 所述,反序列化为 RcArc 的实现的缺点是:

这在 feature flag documentation 中得到了回应:
RcArc 的通常点是共享数据。当反序列化为包含 RcArc 的结构时,不会发生这种共享。在这个例子中,创建了 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<_>> 或其他具有内部可变性的类型时,这尤其糟糕,因为您可能期望修改其中一个项目会修改所有项目。
也可以看看:
  • Is there a way to distingush between different `Rc`s of the same value?
  • How can I get Serde to allocate strings from an arena during deserialization?
  • 关于rust - 为什么 Serde 默认不支持 Rc 和 Arc 类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60604346/

    10-14 06:51