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

问题描述 投票:1回答:1

请说明Serde rc功能

[为Rc<T>Arc<T>选择加入提示。序列化和反序列化这些类型不会保留身份,可能会导致相同数据的副本。确保这是您想要的启用此功能。

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

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

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

是什么意思

对这些类型进行序列化和反序列化不会保留身份,并且可能导致同一数据的多个副本

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

[如果您要确保不会意外地得到包含rc的派生impl,请打开一个问题。

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

rust reference-counting serde
1个回答
2
投票

可能增加内存使用量
    依靠地址中断比较的平等比较
  • 内部可变性未反映在副本中
  • [在feature flag documentation中回显:
  • 序列化将不会尝试对这些重复的数据进行重复数据删除。

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

    RcArc的通常点是

    share数据。反序列化为包含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], &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?

    © www.soinside.com 2019 - 2024. All rights reserved.