#neon #serialization #fork #object #value #neon-serde

neon-serde3

轻松将对象序列化以供neon使用,neon-serde的分支

1 个不稳定版本

0.10.0 2022年7月7日

#1042 in 编码

Download history 604/week @ 2024-04-22 310/week @ 2024-04-29 383/week @ 2024-05-06 774/week @ 2024-05-13 653/week @ 2024-05-20 494/week @ 2024-05-27 663/week @ 2024-06-03 469/week @ 2024-06-10 594/week @ 2024-06-17 458/week @ 2024-06-24 467/week @ 2024-07-01 736/week @ 2024-07-08 420/week @ 2024-07-15 517/week @ 2024-07-22 449/week @ 2024-07-29 372/week @ 2024-08-05

1,777 每月下载量
用于 chidori

MIT 许可证

75KB
1K SLoC

Rust 1K SLoC JavaScript 189 SLoC Shell 27 SLoC // 0.1% comments

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