约定(Conventions)

按照惯例,一个 Serde 数据格式的 crate 在根模块中应该提供以下内容或从根模块重新导出:

  • 一个错误类型,用于序列化和反序列化。
  • 一个结果类型定义,等同于 std::result::Result<T, Error>。
  • 一个实现了 serde::Serializer 的 Serializer 类型。
  • 一个实现了 serde::Deserializer 的 Deserializer 类型。
  • 一个或多个 to_abc 函数,取决于该格式支持序列化成什么类型。例如,to_string 返回一个字符串,to_bytes 返回一个 Vec<u8>,或者 to_writer 写入一个 io::Write
  • 一个或多个 from_xyz 函数,取决于该格式支持从什么类型反序列化。例如,from_str 接受一个 &str,from_bytes 接受一个 &[u8],或者 from_reader 接受一个 io::Read

另外,如果提供了超出 Serializer 和 Deserializer 之外的序列化或反序列化特定 API,数据格式应该将这些内容公开在顶层的 serde 模块下。例如,serde_json 提供了一个可插拔的 pretty-printer trait,例如serde_json::ser::Formatter

一个基本的数据格式开始如下。这三个模块将在接下来的页面中更详细地讨论。

macro_rules! modules {
    (mod de) => {
        mod de {
            pub fn from_str() {}
            pub type Deserializer = ();
        }
    };
    (mod error) => {
        mod error {
            pub type Error = ();
            pub type Result = ();
        }
    };
    (mod ser) => {
        mod ser {
            pub fn to_string() {}
            pub type Serializer = ();
        }
    };
    ($(mod $n:ident;)+) => {
        $(
            modules!(mod $n);
        )+
    };
}

modules! {
mod de;
mod error;
mod ser;
}

pub use de::{from_str, Deserializer};
pub use error::{Error, Result};
pub use ser::{to_string, Serializer};

fn main() {}