如何將Rust的“struct”轉換為資料流?

banq發表於2022-10-06

當且僅當原始結構派生Serialize和Deserialize特徵時,可以使用bincode將它們序列化為 binary-encoded Vec<u8>。

在這裡,我用一個元組結構MyStruct包裹了原始結構StructFromAnotherTool,並使用hex將結果從Vec<u8>編碼和解碼為十六進位制字串,這樣我就可以很容易地將十六進位制字串表示法儲存在資料庫中。
請注意,這些結構在最後派生出PartialEq和Debug,然後使用斷言測試。

use serde::{Deserialize, Serialize};
use hex;

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct StructFromOtherTool {
    x: f32,
    y: f32,
}

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct MyStruct(StructFromOtherTool);

fn main() { 
    let mystruct = MyStruct(SomeStruct { x: 1.3, y: 5.2 });

    let encoded: Vec<u8> = bincode::serialize(&mystruct).unwrap();

   // 這個十六進位制的字串表示可以儲存在資料庫中。
    let s = hex::encode(encoded.clone());

    println!("Hex encoded struct: {}", s);

   // 然後我們對十六進位制字串進行解碼,並使用bincode將其反序列化為一個MyStruct實體。
    let v = hex::decode(s).unwrap();

    let decoded = bincode::deserialize(&v[..]).unwrap();

    assert_eq!(mystruct, decoded);

相關文章