2 个版本
使用旧的 Rust 2015
0.1.1 | 2018 年 10 月 8 日 |
---|---|
0.1.0 | 2018 年 9 月 29 日 |
#1097 在 编码
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
Fressian 由 Stuart Halloway 和 Cognitect 的好人设计。这里有一个 clojure 包装 here。这里有一个设计讨论 here。
依赖项
~2.3–3.5MB
~78K SLoC