#反序列化 #序列化 #redis #serde #错误字符串

serde-resp

使用serde进行Redis RESP协议的序列化和反序列化

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次 下载

MIT 协议

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_stringser::to_writer

要反序列化,请使用 de::from_strde::from_readerde::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没有结构化类型(除了数组)。这意味着(反)序列化如 structenumtuple 这样的结构化数据是没有意义的。
  • RESP支持多种字符串类型(简单字符串和错误字符串)。那么Rust的String应该映射到哪种类型?简单字符串还是错误字符串?使用serde提供的功能会导致很多歧义。另一个问题是,serde假设只有一个字符串类型,所以我需要应用一些“技巧”来使序列化和反序列化器正常工作。这些“技巧”包括用户不应该使用的序列化和反序列化方法。
  • RESP有多个空类型(空批量字符串和空数组)。类似于上面,很多歧义和“技巧”。

还有一个额外的好处是,这使得定义数组变得更简单,数组可以递归。

我知道这非常严格,编写起来也很繁琐。但减少歧义总是好事。而且现在有了宏,使用起来应该更加愉快。

依赖项

~125–365KB