请说明Serde rc
功能
[为
Rc<T>
和Arc<T>
选择加入提示。序列化和反序列化这些类型不会保留身份,可能会导致相同数据的副本。确保这是您想要的启用此功能。序列化包含引用计数指针的数据结构每次将序列化指针内部值的副本时,指针在数据结构内被引用。序列化将不要尝试对这些重复的数据进行重复数据删除。
反序列化包含引用计数指针的数据结构不会尝试对相同数据进行重复数据删除。每一个反序列化的指针将以1的强大计数结束。
为什么此功能标志存在,为什么它不是默认行为?
是什么意思对这些类型进行序列化和反序列化不会保留身份,并且可能导致同一数据的多个副本
我知道它与Serde issue 194有关。 last message of the issue说
[如果您要确保不会意外地得到包含rc的派生impl,请打开一个问题。
功能标记是否存在以捕获Rc
结构的意外用法?
可能增加内存使用量依靠地址中断比较的平等比较
- 内部可变性未反映在副本中
序列化将不会尝试对这些重复的数据进行重复数据删除。
反序列化包含引用计数指针的数据结构将不会尝试对相同数据的引用进行重复数据删除。
Rc
或Arc
的通常点是
share数据。反序列化为包含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], &strings[1]));
}
[src/main.rs:14] ptr::eq(&strings[0], &strings[1]) = false
[当您具有内部可变性的
。Rc<RefCell<_>>
或其他类型时,这尤其糟糕,因为您可能希望修改其中一个项目会修改项目的[[all
另请参见: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?