Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么Serde默认不支持Rc和Arc类型?_Rust_Reference Counting_Serde - Fatal编程技术网

Rust 为什么Serde默认不支持Rc和Arc类型?

Rust 为什么Serde默认不支持Rc和Arc类型?,rust,reference-counting,serde,Rust,Reference Counting,Serde,请解释Serderc功能 为Rc和Arc选择impls。序列化和反序列化 这些类型不保留标识,可能导致多个 相同数据的副本。确保这是你之前想要的 启用此功能 序列化包含引用计数指针的数据结构 将序列化指针内部值的副本,每次 指针在数据结构中被引用。序列化将 不要尝试删除这些重复数据 反序列化包含引用计数指针的数据结构 不会尝试删除对同一数据的重复引用。每一个 反序列化指针将以强计数1结束 为什么这个特性标志存在,为什么它不是默认行为?这是什么意思 序列化和反序列化这些类型不会保留标识,并可能导致

请解释Serde
rc
功能

Rc
Arc
选择impls。序列化和反序列化 这些类型不保留标识,可能导致多个 相同数据的副本。确保这是你之前想要的 启用此功能

序列化包含引用计数指针的数据结构 将序列化指针内部值的副本,每次 指针在数据结构中被引用。序列化将 不要尝试删除这些重复数据

反序列化包含引用计数指针的数据结构 不会尝试删除对同一数据的重复引用。每一个 反序列化指针将以强计数1结束

为什么这个特性标志存在,为什么它不是默认行为?这是什么意思

序列化和反序列化这些类型不会保留标识,并可能导致相同数据的多个副本

我知道这和我的工作有关。警察说

如果您想确保不会意外地得到包含rc的派生IML,请打开clippy问题

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

如中所述,反序列化到
Rc
Arc
的实现的缺点是:

  • 可能会增加内存使用
  • 依赖于地址断开比较的相等比较
  • 内部易变性不反映在副本中
这反映在:

序列化不会尝试删除这些重复数据

反序列化包含引用计数指针的数据结构不会尝试删除对同一数据的重复引用

Rc
Arc
的通常点是共享数据。当反序列化到包含
Rc
Arc
的结构时,不会发生此共享。在此示例中,创建了5个完全不同的
Rc
s,彼此之间没有任何关系,即使它们都具有相同的内容:

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()));
}
当您有一个
Rc
或其他具有内部易变性的类型时,这尤其糟糕,因为您可能期望修改其中一个项会修改所有项

另见:


我似乎可以理解“可能导致同一数据的多个副本”这句话-你觉得它有什么让人困惑的地方?为什么它最终会有多个副本?例如,如果它反序列化一个字符串,然后将其包装在
Rc
struct中,则只有一个副本。多个副本来自哪里?我可以理解它的序列化,因为它需要一个副本才能放入文件缓冲区。有趣。你的例子正是我所期望的-5个完全不同的
Rc
s<代码>Rc不保证唯一性。如果我在寻找唯一性,我会希望使用类似集合的结构。相等将比较结构所指向的数据
Rc
struct,而不是指针本身。@NebulaFox这意味着您可以进行序列化和反序列化。我现在明白了。往一个方向走不会招致记忆的惩罚,但来回走会招致记忆的惩罚。