serde
库提供序列化(serialize)和反序列化(deserialize)的特征,通过derive生成,可以把rust的自定义类型(struct)转换成多种常用的兼容类型例如JSON、CBOR、bincode,用于在网络间传输,其中JSON是比较常用的类型,特点是兼顾human-readable和machine-readable,另外两种仅仅是machine-readable,Page215给了一个范例;- 检索一个文件的内容采用hexdump的方式,把一系列字节流转化成2个16进制的数字(也就是正好一个字节),这种视图叫做fview(file view文件视图),表7.2展示了一个fview的输入和输出
- 多行字符串作为原始字符串时(raw string)不需要将双引号转义,原始字符串的pattern是前缀
r
,分隔符#
,还有额外的前缀b
表示后面的字符串要看作字节(&[u8])而不是UTF-8字符(&str),下图是一个例子 f.read_exact(&mut buffer)
方法把数据从源头f
到buffer
中,当buffer满的时候才会停止,如果buffer比f中的数据要长,会返回一个error;std::env::args()
用于读命令行的参数;std::fs::OpenOptions
可以用来创建可写的文件,与File::open
和File::create
不同,它可以定制化一些功能,open和create的区别如下表所示- 处理文件路径的时候推荐使用
Path
库,有3个好处,a.明确开发者的意图,例如set_extension()
方法能设置扩展名;b. 多平台兼容性,不同的操作系统对文件路径的处理不通,例如有的操作系统对文件名的大小写敏感而有的不,还有不同的操作系统对路径分隔符的使用也不同;c. 易于debug,Path
库提供了很多好用的API来处理文件路径;下表给出了一个对比std::String
和std::path::Path
处理文件路径的区别 - 7.5节简单构建了一个内存数据库的项目,介绍了
cargo.toml
中lib
和bin
的使用规则以及调用路径,是一个小而全的软件工程实践项目,对于个人开发rust工具有很大的启发,Page222; - 7.6.1节介绍了条件编译(conditional compilation)的用法,在需要条件编译的语句上方加入
#[cfg(target_os="windows")]
可以让该语句仅在windows系统下编译,对于·非·操作,没有!=
符号,而是#[cfg(not(...))]
,可以设置的编译条件还有target_arch、target_env等,详见Page227; std::io::ErrorKind::UnexpectedEof
错误是当程序读到文件结尾时报的错误,EOF是一个0字节(0u8),在文件结尾没有一个特殊的标记来表示文件已经结束,因此读到结尾无法再继续读的时候会抛出这个错误;- 7.7.3节介绍了写入二进制数据到磁盘中的顺序问题,可以制定大端/小端写入的方式,注意
i8, u8
这样的数据是不用制定大端小端的,因为只有一个字节,像u32, f64
这种就可以指定,写入效果可见Page233; - 7.7.3节介绍了写入磁盘的校验方法,常见的3种是奇偶校验法(parity bit)、循环冗余法(CRC32)、加密哈希法(Cryptographic hash function),他们之间的对比如下表所示