Я нашел (возможно, очень уродливый) способ сделать это, не внедрив свой собственный десериализатор - Bincode мог бы сделать это в конце концов.Это выглядит примерно так:
impl<'de> Deserialize<'de> for VarLen16 {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct VarLen16Visitor;
impl<'de> Visitor<'de> for VarLen16Visitor {
type Value = VarLen16;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("VarLen16")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut res: Vec<u8> = vec![];
let length: u16 = seq
.next_element()?
.ok_or_else(|| serde::de::Error::invalid_length(1, &self))?;
for i in 0..length {
res.push(
seq.next_element()?
.ok_or_else(|| serde::de::Error::invalid_length(1, &self))?,
);
}
return Ok(VarLen16(res));
}
}
return Ok(deserializer.deserialize_tuple(1 << 16, VarLen16Visitor)?);
}
}
Короче говоря, я заставляю систему думать, что я десериализирую кортеж, где я устанавливаю длину на максимум, который мне нужен.Я проверил это, на самом деле он не выделяет столько памяти.Затем я веду себя так, как будто длина является частью этого кортежа, сначала читаю его, а затем продолжаю читать, насколько мне подсказывает эта длина.Это не красиво, но, безусловно, работает.