4个版本 (2个重大更新)
0.3.1 | 2021年2月16日 |
---|---|
0.3.0 | 2021年2月15日 |
0.2.0 | 2021年2月15日 |
0.1.0 | 2021年2月15日 |
#1529 在 编码
每月23次 下载
40KB
804 行
serde-RESP
使用serde进行Redis RESP协议的序列化和反序列化。 RESP规范
要使用此库,请将以下内容添加到您的 Cargo.toml
[dependencies]
serde-resp = "0.3.1"
用法
重要:请不要使用除 RESP/RESPType
之外的任何类型进行(反)序列化!否则可能会导致panic或得到错误的结果! 为什么?
以下是Redis RESP类型及其对应的Rust类型,用于(反)序列化操作。
简单字符串
RESP::简单字符串(字符串)
错误
RESP::错误(字符串)
整数
RESP::整数(i64)
批量字符串
RESP::批量字符串(可选<Vec<u8>>)
- 使用
None
表示null批量字符串,使用Some
表示非null的。
- 使用
数组
RESP::数组(可选<Vec<RESP>>)
- 使用
None
表示null数组,使用Some
表示非null的。
- 使用
要序列化,请使用 ser::to_string 或 ser::to_writer。
要反序列化,请使用 de::from_str 或 de::from_reader 或 de::from_buf_reader。
有关用法示例,请参阅 https://docs.rs/serde_resp/0.3.1/serde_resp/enum.RESPType.html
宏定义
从0.3.0版本开始,您可以开始使用非常实用的宏!以下是一个示例
use serde_resp::{array, array_null, bulk, bulk_null, de, err_str, int, ser, simple, RESP};
let resp_array = array![
simple!("simple string".to_owned()),
err_str!("error string".to_owned()),
int!(42),
bulk!(b"bulk string".to_vec()),
bulk_null!(),
array![
simple!("arrays of arrays!".to_owned()),
array![simple!("OK ENOUGH!".to_owned())],
],
array_null!(),
];
let serialized = ser::to_string(&resp_array).unwrap();
assert_eq!(
"*7\r\n+simple string\r\n-error string\r\n:42\r\n$11\r\nbulk string\r\n$-1\r\n*2\r\n+arrays of arrays!\r\n*1\r\n+OK ENOUGH!\r\n*-1\r\n",
serialized
);
let deserialized = de::from_str(&serialized).unwrap();
assert_eq!(resp_array, deserialized);
文档
https://docs.rs/serde_resp/0.3.1/serde_resp
为什么需要RESPType包装器?
RESP协议与serde数据模型不太匹配。
- RESP没有结构化类型(除了数组)。这意味着(反)序列化如
struct
、enum
或tuple
这样的结构化数据是没有意义的。 - RESP支持多种字符串类型(简单字符串和错误字符串)。那么Rust的
String
应该映射到哪种类型?简单字符串还是错误字符串?使用serde提供的功能会导致很多歧义。另一个问题是,serde假设只有一个字符串类型,所以我需要应用一些“技巧”来使序列化和反序列化器正常工作。这些“技巧”包括用户不应该使用的序列化和反序列化方法。 - RESP有多个空类型(空批量字符串和空数组)。类似于上面,很多歧义和“技巧”。
还有一个额外的好处是,这使得定义数组变得更简单,数组可以递归。
我知道这非常严格,编写起来也很繁琐。但减少歧义总是好事。而且现在有了宏,使用起来应该更加愉快。
依赖项
~125–365KB