Skip to content

This crate fails to decode Vec<u8> #50

@Boog900

Description

@Boog900

When de-serializing a sequence this crate goes straight to dispatch_based_on_marker:

fn deserialize_seq<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
where
V: Visitor<'de>,
{
let marker = self.read_marker()?;
self.dispatch_based_on_marker(marker, visitor)
}

This is wrong for a byte array which is tagged as a string:

fn dispatch_based_on_marker<'de, V>(&mut self, marker: Marker, visitor: V) -> Result<V::Value>
where
V: Visitor<'de>,
{
match marker {
Marker::Sequence {
element: element_marker,
} => visitor.visit_seq(SeqAccess::with_varint_encoded_length(self, element_marker)?),
MARKER_SINGLE_I64 => visitor.visit_i64(self.buffer.read_i64::<LittleEndian>()?),
MARKER_SINGLE_I32 => visitor.visit_i32(self.buffer.read_i32::<LittleEndian>()?),
MARKER_SINGLE_I16 => visitor.visit_i16(self.buffer.read_i16::<LittleEndian>()?),
MARKER_SINGLE_I8 => visitor.visit_i8(self.buffer.read_i8()?),
MARKER_SINGLE_U64 => visitor.visit_u64(self.buffer.read_u64::<LittleEndian>()?),
MARKER_SINGLE_U32 => visitor.visit_u32(self.buffer.read_u32::<LittleEndian>()?),
MARKER_SINGLE_U16 => visitor.visit_u16(self.buffer.read_u16::<LittleEndian>()?),
MARKER_SINGLE_U8 => visitor.visit_u8(self.buffer.read_u8()?),
MARKER_SINGLE_F64 => visitor.visit_f64(self.buffer.read_f64::<LittleEndian>()?),
MARKER_SINGLE_STRING => visitor.visit_string(self.read_varint_string()?),
MARKER_SINGLE_BOOL => visitor.visit_bool(self.read_bool()?),
MARKER_SINGLE_STRUCT => visitor.visit_map(MapAccess::with_varint_encoded_fields(self)?),
_ => Err(Error::unknown_marker(marker)),
}
}

Even with my most recent PRs this is still incorrect, to fix this will require special de-serializing logic for Vec<u8> kinda like we have done in deserialize_tuple.

A work around is to use serde_with::Bytes which is more efficient anyway.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions