【问题标题】:How To Do Zero-Copy Deserialization of Recursive Enums with Serde?如何使用 Serde 对递归枚举进行零拷贝反序列化?
【发布时间】:2022-12-09 15:42:29
【问题描述】:

我什至不确定 serde 是否可行,但我想做的是以下内容:

#[derive(serde::Deserialize)]
pub enum Tree<'a> {
    Zero,
    One(&'a Tree<'a>),
    Two(&'a Tree<'a>, &'a Tree<'a>),
    Three(&'a Tree<'a>, &'a Tree<'a>, &'a Tree<'a>),
}

这是否可能使用特定的 serde 属性(如 #[serde(borrow)] 等)?是否需要自定义实现 Deserialize?或者这不是 serde 可以做的事情?

【问题讨论】:

    标签: rust serde


    【解决方案1】:

    你不能,因为某些东西必须拥有所有新的 Tree 对象。

    但是,您可以创建类似的结构:

    #[derive(Debug, serde::Serialize, serde::Deserialize)]
    pub enum Tree<'a> {
        Zero(&'a str),
        One(Box<Tree<'a>>),
        Two(Box<(Tree<'a>, Tree<'a>)>),
        Three(Box<(Tree<'a>, Tree<'a>, Tree<'a>)>),
    }
    

    我在 Zero 中添加了一个 &amp;'a str 参数,以便在该生命周期内有一些用处,否则你可以一起摆脱它。

    Boxes 是必需的,否则我们会有无限大小的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2021-08-28
      • 2013-07-17
      • 1970-01-01
      相关资源
      最近更新 更多