#文件格式 #io #反序列化 #序列化 #文件io #读写

iodeser

允许从和向 .io 文件格式读写数据的包

15 个版本 (4 个重大更新)

0.5.1 2024 年 7 月 8 日
0.5.0 2024 年 5 月 24 日
0.4.1 2024 年 2 月 23 日
0.3.8 2024 年 2 月 22 日
0.1.3 2024 年 2 月 3 日

#517 in 解析器实现

MIT 许可证

44KB
765

包含 (Cab 文件, 14KB) .vs/rust-library/v17/.wsuo

关于

仓库存储了允许从和向 .io 文件格式读写数据的 Rust 库的代码。

功能和计划

序列化和反序列化的当前状态

  • 原始类型
  • 字符串
  • 数组
  • 向量
  • 哈希表
  • 结构体(命名{}和元组)
  • 泛型
  • 元组
  • &str 类型
  • 切片
  • Option
  • Result
  • 所有上述类型的组合
  • 枚举(单元、未命名、命名)
  • 单元类型 ()

支持类型的完整列表可以在本 crate 的文档 中找到。

功能

  • 使用宏 to_io!() 和对象引用,对 支持类型 进行序列化
  • 使用宏 from_io!() 和 .io 格式化的字符串以及所需的对象类型,对 支持类型 进行反序列化
  • 使用 #[io_name()] 辅助宏(使用字符串字面量作为参数)在 .io 格式化的字符串中重命名结构体字段
  • 使用 #[io_order()] 辅助宏(使用 FIRST 和 LAST 关键字或 i16 整数)在 .io 格式化的字符串中排序结构体字段

以下 示例 展示了这些功能的使用方法。

示例用法

use iodeser::*; // required import

#[derive(IoDeSer, Debug, PartialEq)] // required macro derive IoDeSer, Debug and PartialEq is not required
struct Person<'a> {
    #[io_name("Name")]      // optional renaming
    pub name: &'a str,
    #[io_name("SecondName")]  // optional renaming
    pub second_name: Option<&'a str>,
    #[io_name("LastName")]  // optional renaming
    pub last_name: &'a str,
    #[io_name("Age")]       // optional renaming
    #[io_order(LAST)]       // optional ordering using FIRST or LAST keyword
    pub age: u8,
    #[io_name("Address")]   // optional renaming
    #[io_order(FIRST)]      // optional ordering using FIRST or LAST keyword
    pub address: Vec<Address<'a>>,
}

#[derive(IoDeSer, Debug, PartialEq)] // required macro derive, Debug and PartialEq is not required
struct Address<'a> {
    #[io_order(3)]          // optional ordering using integer
    pub city: &'a str,
    #[io_order(1)]          // optional ordering using integer
    pub number: AddressNumberType<'a>,
    #[io_order(2)]          // optional ordering using integer
    pub street: &'a str,
}

#[derive(IoDeSer, Debug, PartialEq)] // required macro derive, Debug and PartialEq is not required
enum AddressNumberType<'a>{
    Numeric(u16),
    String(&'a str)
}

fn main() {
    let person = Person {
        name: "John",
        second_name: None,
        last_name: "Kowalski",
        age: 21,
        address: vec![
            Address {
                city: "Warsaw",
                number: AddressNumberType::Numeric(65),
                street: "Tęczowa",
            },
            Address {
                city: "Hamburg",
                number: AddressNumberType::String("220a"),
                street: "Strasse",
            },
        ],
    };

    let io_serialization: String = to_io!(&person); // serialization
    println!("{}", &io_serialization);

    let person_deserialization: Person = from_io!(io_serialization, Person).unwrap(); // deserialization
    println!("{:?}", &person_deserialization);

    assert_eq!(person, person_deserialization);
}
/*
Output:
|
	Address->|
		|
			number->|
				Numeric->|
					|65|
				|
			|
			street->|Tęczowa|
			city->|Warsaw|
		|
		+
		|
			number->|
				String->|
					|220a|
				|
			|
			street->|Strasse|
			city->|Hamburg|
		|
	|
	Name->|John|
	SecondName->|||
	LastName->|Kowalski|
	Age->|21|
|
Person { name: "John", second_name: None, last_name: "Kowalski", age: 21, address: [Address { city: "Warsaw", number: Numeric(65), street: "Tęczowa" }, Address { city: "Hamburg", number: String("220a"), street: "Strasse" }] }
*/

依赖

~1.3–2MB
~45K SLoC