#clojure #wasm #clojurescript

serde-fressian

Fressian for rust/wasm

2 个版本

使用旧的 Rust 2015

0.1.1 2018 年 10 月 8 日
0.1.0 2018 年 9 月 29 日

#1097编码

MIT 许可证

155KB
3.5K SLoC

serde-fressian = "0.1.1" 最新版本

Fressian 是为 clojure 开发的自描述二进制序列化格式。

wasm⥪fressian⥭cljs

当编译为 WebAssembly 时,serde-fressian 可以用来在 clojurescript 之间传递丰富的值。

serde-fressian 有 2 个配套项目

  • fress
    • 为 clojurescript 实现的 Fressian,旨在通过 JavaScript 与 serde-fressian 的 wasm api 交互。
  • cargo-cljs
    • 一个用于通过 nodejs 编写 cargo 的 clojurescript 库

正在进行中

  • 没有记录,BIGINT,BIGDEC,OBJECT_ARRAY,char
  • 除了需要缓存的类型外没有缓存
  • 没有校验和/验证
  • serde::fressian::value 需要 own Deserializer/Serializer 实现,索引,身份谓词
  • 还有许多针对 wasm 的特定优化尚未实现

用法

serde-fressian 尽量遵循标准 serde 约定。反序列化器可以接受读取器、vec 和切片。然而,当前的序列化器仅支持将数据写入 vec。

use serde_fressian::ser;
use serde_fressian::de;

let write_data: Vec<String> = vec!["some".to_string(), "strings".to_string()];

let bytes: Vec<u8> = ser::to_vec(&data).unwrap();

// this is strongly typed deserialization
let read_data: Vec<String> = de::from_vec(&bytes).unwrap();

assert_eq!(write_data,read_data)

如果您事先知道字节将包含什么,可以使用强类型反序列化来提取您的值。这不如灵活,但非常快。如果您不确定内容,serde_fressian::value::Value 是一个枚举,包含所有 fressian 类型,将按描述反序列化值。

use serde_fressian::ser;
use serde_fressian::de;
use serde_fressian::value::{Value};

let write_data: Vec<String> = vec!["some".to_string(), "strings".to_string()];

let bytes: Vec<u8> = ser::to_vec(&data).unwrap();

// this is weakly typed deserialization
let read_data: Value = de::from_vec(&bytes).unwrap();

// Value::LIST(vec![Value::STRING("some".to_string()),Value::STRING("strings".to_string())])
assert_eq!(read_data, Value::from(write_data))

Wasm API

serde_fressian::wasm 模块旨在与 fress.wasm 互操作

use serde_fressian::error::{Error as FressError};
use serde_fressian::value::{self, Value};
use serde_fressian::wasm::{self};


// called by javascript with ptr to written bytes
#[no_mangle]
pub extern "C" fn echo(ptr: *mut u8, len: usize) -> *mut u8
{
    // read a value from javascript
    let val: Result<Value, FressError> = wasm::from_ptr(ptr, len);

    // from_ptr borrows, Value copies. So must own and free bytes separately
    wasm::fress_dealloc(ptr, len);

    //serializes the result, hands ownership of resulting bytes over to js
    wasm::to_js(val)
}

文档

为了我的理智,大部分文档将在 fress

关于 Fressian

FressianStuart Halloway 和 Cognitect 的好人设计。这里有一个 clojure 包装 here。这里有一个设计讨论 here

依赖项

~2.3–3.5MB
~78K SLoC