dlhn icon indicating copy to clipboard operation
dlhn copied to clipboard

String > 128 bytes fails to roundtrip

Open caibear opened this issue 11 months ago • 0 comments

dlhn = "0.1.6"
serde = "1.0"
fn main() {
    use serde::{Serialize, Deserialize};

    let original = " ".repeat(129);
    let mut serialized = vec![];
    original.serialize(&mut dlhn::Serializer::new(&mut serialized)).unwrap();

    let deserialized = String::deserialize(&mut dlhn::Deserializer::new(&mut serialized.as_slice())).unwrap();
    assert_eq!(original, deserialized);
}

The string gets serialized with all 129 bytes, but only 128 bytes are deserialized causing the assert_eq to fail. This is caused by #13. A possible fix for deserializing String and Vec<u8> that wouldn't break #11:

fn main() -> std::io::Result<()> {
    use std::io::{self, Read};
    let reader: &mut dyn Read = &mut [b' '; 100].as_slice();
    let len = 10;

    let mut s = String::new();
    if reader.take(len as u64).read_to_string(&mut s)? != len {
        return Err(io::Error::new(io::ErrorKind::UnexpectedEof, ""));
    };
    assert_eq!(s, " ".repeat(len));

    let mut v = Vec::new();
    if reader.take(len as u64).read_to_end(&mut v)? != len {
        return Err(io::Error::new(io::ErrorKind::UnexpectedEof, ""));
    };
    assert_eq!(v, vec![b' '; len]);

    Ok(())
}

caibear avatar Mar 10 '24 20:03 caibear