簡體   English   中英

Rust 中 Borsh 序列化/反序列化方法的包裝

[英]Wrapper over Borsh Serialization/Deserialization methods in Rust

我有一個結構 A 實現 BorshDeserialize 和 BorshSerialize 如下

#[derive(Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize)]
struct A {
   a : i32,
   b:  String,
}

我知道我可以在執行以下操作時序列化或反序列化 A:-

let s = A {a: 1 , b: "a".to_string()};

// Serialize 
let serialzed_data = s.try_to_vec().unwrap()

// Deserialize
deserialized_struct = A::try_from_slice(&serialzed_data).unwrap();

我試圖通過在 main.rs 上創建兩個通用特征來覆蓋這兩種方法,我從另一個文件 a.rs 導入這個結構。

pub trait Serializable<T: BorshSerialize> {
    fn serialize(s: T) -> Vec<u8> {
        s.try_to_vec().unwrap()
    }
}

pub trait Deserializable<T : BorshDeserialize> {
    fn deserialize(s: &[u8]) -> Result<T, ()> {
        let deserialized_val = match T::try_from_slice(&s) {
            Ok(val) => {val},
            Err(_) => {return Err(());},
        };
        Ok(deserialized_val)
    }
}

我在 a.rs 上為 A 實現序列化和反序列化,如下所示

impl Serializable<A> for A {}
impl Deserializable<A> for A {}

但是在源代碼中,當我為此指令在 A 上調用方法序列化時,

A::serialize(&some_instance_of_A).unwrap()

我收到以下錯誤

A::serialize(&some_instance_of_A).unwrap()
   ^^^^^^^^^ multiple `serialize` found
   |
   = note: candidate #1 is defined in an impl of the trait `Serializable` for the type `A`
   = note: candidate #2 is defined in an impl of the trait `BorshSerialize` for the type `A`

help: disambiguate the associated function for candidate #1
   |
46 |   <&Self as A::Serializable>::serialize(&some_instance_of_A), // TODO. See issue #64
   |                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
help: disambiguate the associated function for candidate #2
   |
46 |   <&A as BorshSerialize>::serialize(&some_instance_of_A).concat(), // TODO. See issue #64
   |

我知道編譯器對創建的兩個序列化方案實例感到困惑(一個是由於派生宏的 Borsh 而另一個是 main.rs 上的 Serialize trait)。 有沒有辦法在調用 A::serialize 時直接使序列化調用默認為 BorshSerialize。

通過阻止導入BorshSerialize特征,您可以擺脫錯誤。

只有 scope 中的Serializable trait,只能調用一種方法:

#[derive(Clone, PartialEq, Eq, borsh::BorshSerialize, borsh::BorshDeserialize)]
struct A {
    a : i32,
    b:  String,
}

impl Serializable for A {}

fn main() {
    let a = A { a: 0, b: String::from("") };
    let vec = a.serialize();
    eprintln!("{:?}", vec);
}

pub trait Serializable: borsh::BorshSerialize {
    fn serialize(&self) -> Vec<u8> {
        self.try_to_vec().unwrap()
    }
}

pub trait Deserializable<T : borsh::BorshDeserialize> {
    fn deserialize(s: &[u8]) -> Result<T, ()> {
        let deserialized_val = match T::try_from_slice(&s) {
            Ok(val) => {val},
            Err(_) => {return Err(());},
        };
        Ok(deserialized_val)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM