1

「バイト」フィールドを含める必要がある構造体があり、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に置き換えるときに同じ問題が発生しましたVecVec<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)
    }
}
4

1 に答える 1