2017-04-22 8 views
9

私はbase64文字列からのデータをデコードするserdeとserde_json 1.0を使用しています:生涯エラーserdeを実装した値を返す関数を作成する::デシリアライズ

fn from_base64_str<T: Deserialize>(string: &str) -> T { 
    let slice = decode_config(string, URL_SAFE).unwrap();  
    serde_json::from_slice(&slice).unwrap() 
} 

私はコンパイルするとき、私はこれを得ました

pub trait Deserialize<'de>: Sized { 

だから私:serdeドキュメント、Deserializeは次のように定義されたチェック

error[E0106]: missing lifetime specifier 
--> src/main.rs:6:23 
    | 
6 | fn from_base64_str<T: Deserialize>(string: &str) -> T { 
    |      ^^^^^^^^^^^ expected lifetime parameter 

寿命をdded:

fn from_base64_str<'de, T: Deserialize<'de>>(string: &str) -> T { 
    let slice = decode_config(string, URL_SAFE).unwrap();  
    serde_json::from_slice(&slice).unwrap() 
} 

コンパイラその後、私に言った:

error: `slice` does not live long enough 
    --> src/main.rs:11:29 
    | 
11 |  serde_json::from_slice(&slice).unwrap() 
    |        ^^^^^ does not live long enough 
12 | } 
    | - borrowed value only lives until here 
    | 
note: borrowed value must be valid for the lifetime 'de as defined on the body at 9:64... 
    --> src/main.rs:9:65 
    | 
9 | fn from_base64_str<'de, T: Deserialize<'de>>(string: &str) -> T { 
    | _________________________________________________________________^ starting here... 
10 | |  let slice = decode_config(string, URL_SAFE).unwrap(); 
11 | |  serde_json::from_slice(&slice).unwrap() 
12 | | } 
    | |_^ ...ending here 

私だけルスト寿命の非常に基本を知っているので、私は非常にtrait Deserialize'deで混乱しています。

どのようにこのような機能で生涯エラーを修正できますか?私はRust 1.18.0を毎晩使用しています(452bf0852 2017-04-19)

答えて

6

Serde issue 891から回答が見つかりました:の代わりにDeserializeOwnedを使用してください。

4

This section of the Serde website covers Deserialize bounds in detail.


IMPLブロックまたは機能上、またはどこか他のかどうか、Deserialize形質境界を書くには、2つの主要な方法があります。

  • <'de, T> where T: Deserialize<'de>

    これは、 "Tが一部寿命から非直列化することができます。" という意味呼び出し元は、それがどの生涯であるかを判断します。通常、これは、呼び出し元がデシリアライズされているデータを、たとえばserde_json::from_strのような関数で提供している場合に使用されます。その場合、入力データの有効期間は'deでなければなりません。たとえば、&'de strとなります。

  • <T> where T: DeserializeOwned

    これは、 "Tがから任意の寿命を非直列化することができます。" という意味被告人はどの生涯を決定するようになる。通常、これは、関数が返される前に逆シリアル化されるデータが破棄されるため、Tがそこから借りることを許されてはならないからです。たとえば、base64でエンコードされたデータを入力として受け取り、base64からデコードし、T型の値を逆シリアル化してからbase64のデコード結果を破棄する関数です。このバインドの別の一般的な使用法は、serde_json::from_readerのようにIOストリームから逆シリアル化する関数です。

    さらに詳しく言うと、DeserializeOwnedの形質はhigher-rank trait boundfor<'de> Deserialize<'de>に相当します。唯一の違いは、DeserializeOwnedが読むのがより直感的です。これは、Tがデシリアライズされたすべてのデータを所有していることを意味します。

関連する問題