如何有条件地创建序列化程序和序列?(选项<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(())
}

(原始代码片段来自此处。

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

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

通过在 if 正文之外声明ser来确保它不会过早被删除:

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()?;

相关内容

  • 没有找到相关文章

最新更新