如何有条件地创建序列化器和序列? (选项<SerializeSeq>)

How to conditionally create a serializer and sequence? (Option<SerializeSeq>)

我正在尝试处理来自通道的数据,因此无法立即序列化整个结构。事实上,它不会全部适合内存。我 运行 遇到的麻烦是我无法创建 Option<SerializeSeq>,因为该对象依赖于 Serializer(它的寿命不够长)。我想一起初始化它们,或者根本不初始化它们:

use serde::ser::{SerializeSeq, Serializer};
fn process_stream(output: bool) -> serde_json::Result<()> {
    let rows = /* whatever iterator */ "serde".chars();

    let mut seq = if output {
        let out = std::io::stdout();
        let mut ser = serde_json::Serializer::new(out);
        let seq = ser.serialize_seq(None)?
        Some(Ok(seq))
    } else {
        None
    }.transpose()?;

    for row in rows {
        //process_data(row);
        if let Some(seq) = &mut seq {
            seq.serialize_element(&row)?;
        }
    }

    if let Some(seq) = seq {
        seq.end()?;
    }
    Ok(())
}

(来自 here 的原始代码片段。)

问题是:ser does not live long enough。但我不想在外部范围内初始化 ser,因为它可能未启用(并且它的作者会创建或截断不应创建的文件)。我尝试将 serseq 作为元组返回。我尝试将它们放在一个辅助结构中,但我无法弄清楚所有模板参数和生命周期。

如何根据条件初始化 serde 序列化程序和序列并存储在 Option 中?

确保 ser 不会通过在 if 主体之外声明而过早删除:

let mut ser;
let mut seq = if output {
    let out = std::io::stdout();
    ser = serde_json::Serializer::new(out);
    let seq = ser.serialize_seq(None)?;
    Some(Ok(seq))
} else {
    None
}.transpose()?;