序列化结构时出错:预期结构 JsValue,发现结构错误

Error serializing struct: Expected struct JsValue, found Struct Error

我遇到错误:

expected enum `std::result::Result<_, wasm_bindgen::JsValue>`
         found enum `std::result::Result<_, serde_wasm_bindgen::error::Error>`

当我通过实现 Serialize 然后将其传递给 serde_wasm_bindgen 来序列化结构时,它使用 here
中的示例代码 这是最小可重现代码:

use wasm_bindgen::prelude::*;
use serde::ser::{Serialize, SerializeStruct, Serializer};

struct Person {
    name: String,
    age: u8,
    phones: Vec<String>,
}
impl Serialize for Person {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let mut s = serializer.serialize_struct("Person", 3)?;
        s.serialize_field("name", &self.name)?;
        s.serialize_field("age", &self.age)?;
        s.serialize_field("phones", &self.phones)?;
        s.end()
    }
}

#[wasm_bindgen]
pub fn pass_value_to_js() -> Result<JsValue, JsValue> {
    let p = Person {
        name: String::from("Hello"),
        age: 56,
        phones: vec![String::from("phone")],
    };
    serde_wasm_bindgen::to_value(p) // error here
}

Cargo.toml

serde-wasm-bindgen = "0.1.3"
serde = "1.0.114"

我对这些软件包一无所知,但查看 to_value here 的代码似乎结果与 Result<JsValue, JsValue>.[=18= 不兼容]


// The Error in scope here is serde_wasm_bindgen::error::Error
type Result<T> = std::result::Result<T, Error>;

...SNIP...

/// Converts a Rust value into a [`JsValue`].
pub fn to_value<T: serde::ser::Serialize>(value: &T) -> Result<JsValue> {
    value.serialize(&Serializer::new())
}

看来您返回此值的函数必须更改才能与这个新的 Result 类型兼容。

我猜您指的是 README here 中的示例。我经常发现 github 自述文件中的代码示例不正确或已过时。不幸的是,我无法在没有立即 unwrap()ing 的情况下找到使用 to_value() 的示例或测试。

我跟着this issue解决了问题

#[wasm_bindgen]
pub fn pass_value_to_js() -> Result<JsValue, JsValue> {
    serde_wasm_bindgen::to_value(&value).map_err(|err| err.into())
}