序列化结构时出错:预期结构 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())
}
我遇到错误:
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())
}