1 个不稳定版本
0.10.0 | 2022年7月7日 |
---|
#1042 in 编码
1,777 每月下载量
用于 chidori
75KB
1K SLoC
Neon-serde
请阅读
我不是这个crate的真正作者。
这是neon-serde2的一个分支。项目已经过时,并且不再遵循neon的版本更新。
我从这里取了一个PR https://github.com/matrix-org/neon-serde/pull/2(不是我写的),将其放入一个仓库,命名为'neon-serde3',并推送到crates.io。这是我自己的需求。
如果你需要使用neon-serde与neon 0.10.0一起使用,那么你可以自由尝试这个crate。
简介
这是官方neon-serde项目的分支。项目已经过时,并且不再跟随neon的版本更新。
这个crate是一个工具,可以轻松地在
从neon crate中的Handle<JsValue>
和实现serde::{Serialize, Deserialize}
的任何值之间转换
版本支持
neon-serde已在node 8
10
12
上进行了测试
使用方法
neon_serde::from_value
将Handle<js::JsValue>
转换为实现serde::Deserialize
的类型
neon_serde::to_value
˚
将实现serde::Serialize
的值转换为Handle<JsValue>
导出宏示例
export!宏允许你快速定义函数以自动转换它们的参数
#[macro_use]
extern crate neon;
#[macro_use]
extern crate neon_serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_bytes;
#[derive(Deserialize)]
struct User {
name: String,
age: u16,
}
export! {
/// Say hello based on a persons name
fn say_hello(name: String) -> String {
format!("Hello, {}!", name)
}
/// Say how old someone is
fn greet(user: User) -> String {
format!("{} is {} years old", user.name, user.age)
}
/// Say how old someone is, if they exist
fn maybe_say_hello(user: Option<User>) -> Option<String> {
user.map(greet)
}
/// Sorts the bytes in a string
/// use `serde_bytes::ByteBuf` to return a `Buffer` in node
/// a `Vec<u8>` will be an array
fn sort_utf8_bytes(str: String) -> serde_bytes::ByteBuf {
let mut bytes = str.into_bytes();
bytes.sort();
serde_bytes::ByteBuf::from(bytes)
}
/// using `serde_bytes::ByteBuf` will make passing an array
/// of numbers an error
///
/// note: `-> ()` is NOT optional
fn expect_buffer_only(_buff: serde_bytes::ByteBuf) -> () {
// code
}
/// using `Vec<u8>` not accept a buffer
fn expect_array(_buff: Vec<u8>) -> () {
// code
}
/// calculate fibonacci recursively
fn fibonacci(n: i32) -> i32 {
match n {
1 | 2 => 1,
n => fibonacci(n - 1) + fibonacci(n - 2)
}
}
}
直接使用示例
extern crate neon_serde;
extern crate neon;
#[macro_use]
extern crate serde_derive;
use neon::prelude::*;
#[derive(Serialize, Debug, Deserialize)]
struct AnObject {
a: u32,
b: Vec<f64>,
c: String,
}
fn deserialize_something(mut cx: FunctionContext) -> JsResult<JsValue> {
let arg0 = cx.argument::<JsValue>(0)?;
let arg0_value: AnObject = match neon_serde::from_value(&mut cx, arg0) {
Ok(value) => value,
Err(e) => {
return cx.throw_error(e.to_string());
}
};
println!("{:?}", arg0_value);
Ok(JsUndefined::new().upcast())
}
fn serialize_something(mut cx: FunctionContext) -> JsResult<JsValue> {
let value = AnObject {
a: 1,
b: vec![2f64, 3f64, 4f64],
c: "a string".into()
};
neon_serde::to_value(&mut cx, &value)
.or_else(|e| cx.throw_error(e.to_string()))
}
局限性
数据所有权
所有反序列化值必须拥有它们自己的数据(它们必须具有serde::DererializeOwned
特性)
依赖项
~1.5MB
~32K SLoC