「バイト」フィールドを含める必要がある構造体があり、JSON から逆シリアル化しようとしています。
を使用する&'a [u8]
と、これは機能しますが、この構造体とそれを囲む構造体にライフタイム アノテーションを追加する必要があります。
バイトを「所有」して囲みを使用することで回避できると思いましたBox
が、うまくいきませんでした。なぜそうでないのか、またはこれを機能させる方法 (serde 注釈、このフィールドのカスタムヘルパー、またはその他の方法) があるかどうかを理解しようとしています。
より具体的には、これは機能します:
struct Foo<'a> {
some_field: Option<String>,
field_of_interest: &'a [u8],
}
そして、これはしません:
struct Foo {
some_field: Option<String>,
field_of_interest: Box<[u8]>,
}
どちらの場合も、次のように呼んでいます。
let my_foo: Foo = serde_json::from_slice(...);
(つまり as )Box
に置き換えるときに同じ問題が発生しましたVec
Vec<u8>
ソリューションで編集:
以下で @lpiepiora が指摘したように、これには追加のラッパーが必要です。serde_bytes
クレートによって提供される次のようなもの:
#[cfg(any(feature = "std", feature = "alloc"))]
impl<'de> Deserialize<'de> for Box<[u8]> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Deserialize::deserialize(deserializer).map(Vec::into_boxed_slice)
}
}