#serde #opengl #skia #gtk #api-bindings

sciter-serde

Sciter 引擎的 Serde 支持

3 个版本

使用旧的 Rust 2015

0.3.2 2020 年 4 月 16 日
0.3.1 2018 年 4 月 1 日
0.3.0 2018 年 3 月 19 日

编码 中排名 #1085

MIT 许可证

400KB
7.5K SLoC

SerdeSciter 引擎的支持。

虽然技术上你可以只使用 serde_json 包并通过中间字符串进行序列化(类似于 sciter::Value::from_str(&serde_json::to_string(<your data>)?)?),但你也可以在你的数据和 sciter::Value 之间进行直接序列化。

Sciter 值支持的类型

  • 布尔型 (bool)
  • 整数型 (i8-i32)
  • 浮点型 (f32-f64)
  • 字符串型 (&str, String)
  • 字节型 (&[u8])
  • 数组型 (&[T], Vec<T>)
  • 对象型(类似于 structHashMapBTreeMap 等)

不支持

  • 日期
  • 货币
  • 长度
  • 范围
  • 持续时间
  • 角度
  • 颜色

Serde 数据模型支持的类型

  • bool
  • 以下整数类型之外的整数类型
  • i64/u64 - 在 Sciter 中以 f64 格式存储的 64 位整数
  • 字符串
  • 字节数组
  • 可选
  • 单元(存储为 null
  • 单元结构体(存储为 null
  • 单元变体(也称为 枚举,仅存储为 i32 类型的枚举索引)
  • newtype 结构体(也称为 结构体 Io(u32),存储为底层值)
  • newtype 变体
  • 序列,类似于向量(存储为数组)
  • 元组(存储为数组)
  • 元组结构体(存储为数组)
  • 元组变体
  • 映射(存储为映射)
  • 结构体(存储为映射)
  • 结构体变体

有关参考资料,请参阅 Serde 数据模型

示例

extern crate sciter;
extern crate sciter_serde;

use sciter::Value;
use sciter_serde::{from_value, to_value};

fn back_and_forth() {
let v: Value = to_value(&true).unwrap();
let b: bool = from_value(&v).unwrap();
assert_eq!(b, true);
}

fn main() {

// bool
let v: Value = to_value(&true).unwrap();
assert!(v.is_bool());
assert_eq!(v, Value::from(true));

// numbers
let v = to_value(&12u32).unwrap();
assert_eq!(v, 12.into());

let v = to_value(& 42.0f64).unwrap();
assert_eq!(v, 42.0f64.into());

// strings
let v = to_value("hello").unwrap();
assert_eq!(v, "hello".into());

// arrays
let a = [1,2,3];
let v = to_value(&a).unwrap();
assert_eq!(v, a.iter().cloned().collect());

// maps
let m = {
use std::collections::BTreeMap;
let mut m = BTreeMap::new();
m.insert("17", 17);
m.insert("42", 42);
m
};
let v = to_value(&m).unwrap();
assert_eq!(v, Value::parse(r#"{ "17": 17, "42": 42 }"#).unwrap());
}

具有派生序列化

#[macro_use]
extern crate serde_derive;
extern crate serde;

extern crate sciter;
extern crate sciter_serde;

use sciter::Value;
use sciter_serde::to_value;

fn main() {

// structs
#[derive(Serialize)]
struct Test {
x: i32,
y: i32,
}

let v = to_value(&Test {x: 1, y: 2}).unwrap();
assert_eq!(v, Value::parse(r#"{ "x": 1, "y": 2 }"#).unwrap());
}

依赖关系

~115–425KB