use std::io::{Cursor, Read};
use nextjson::{from_reader, NsonDeserialize, NsonSerialize, StreamDecoder};
#[derive(Debug, PartialEq, NsonSerialize, NsonDeserialize)]
struct Message {
id: u64,
body: String,
}
struct ChunkedReader<R> {
inner: R,
chunk: usize,
}
impl<R: Read> Read for ChunkedReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
let want = buf.len().min(self.chunk);
let mut slice = buf;
slice = &mut slice[..want];
self.inner.read(slice)
}
}
fn main() -> nextjson::Result<()> {
let messages = vec![
Message {
id: 1,
body: "first message".into(),
},
Message {
id: 2,
body: "second message".into(),
},
Message {
id: 3,
body: "third message".into(),
},
];
let payload = nextjson::to_vec(&messages)?;
println!("序列化载荷: {} 字节", payload.len());
let slow = ChunkedReader {
inner: Cursor::new(payload.clone()),
chunk: 3,
};
let decoded: Vec<Message> = from_reader(slow)?;
assert_eq!(decoded, messages);
println!(
"from_reader + 3 字节/次: 解码 {} 条消息,与源数据一致",
decoded.len()
);
let single = Message {
id: 42,
body: "streamed".into(),
};
let one_payload = nextjson::to_vec(&single)?;
let slow_one = ChunkedReader {
inner: Cursor::new(one_payload),
chunk: 2,
};
let mut decoder = StreamDecoder::new(slow_one);
let value: Message = Message::nextdecode(&mut decoder)?;
decoder.end()?;
assert_eq!(value, single);
println!("StreamDecoder + 2 字节/次: 解码 msg id = {}", value.id);
let mut full = Cursor::new(nextjson::to_vec(&messages)?);
let mut d = StreamDecoder::new(&mut full);
let streamed: Vec<Message> = Vec::<Message>::nextdecode(&mut d)?;
d.end()?;
assert_eq!(streamed, messages);
println!(
"流式解码整个数组: {} 条消息,首条 id = {}",
streamed.len(),
streamed[0].id
);
Ok(())
}