4个版本 (2个重大更改)
0.3.0 | 2020年4月20日 |
---|---|
0.2.0 | 2019年1月2日 |
0.1.1 | 2018年12月24日 |
0.1.0 | 2018年12月24日 |
#1759 in 编码
每月23次下载
270KB
4K SLoC
serde-gff
通用文件格式 (GFF) -- 由 Bioware Aurora 引擎游戏(如《新维斯特 nights》、《巫师》和《新维斯特 nights 2》)使用的文件格式。
格式有一些限制
- 顶层元素只能是 Rust 的结构体或枚举
- 结构体字段名称不应超过 16 个字节 UTF-8。如果违反此规则,则在序列化过程中将出现错误
- 同样适用于键映射。此外,键可以是字符串(
&str
或String
)
安装
在项目根目录下执行
cargo add serde_gff
或向 Cargo.toml
中添加以下行
[dependencies]
serde_gff = "0.2"
示例
use std::f32::consts::PI;
use std::f64::consts::E;
use std::io::Cursor;
use serde::{Serialize, Deserialize};
use serde_gff::de::Deserializer;
use serde_gff::ser::to_vec;
use serde_gff::value::Value;
#[derive(Debug, Serialize, Deserialize)]
struct Item { u8: u8, i8: i8 }
#[derive(Debug, Serialize, Deserialize)]
struct Struct {
f32: f32,
f64: f64,
#[serde(with = "serde_bytes")]
bytes: Vec<u8>,
}
#[derive(Debug, Serialize, Deserialize)]
#[allow(non_snake_case)]
struct Test {
u16: u16,
i16: i16,
u32: u32,
i32: i32,
u64: u64,
i64: i64,
string: String,
Struct: Struct,
list: Vec<Item>,
}
fn main() {
let data = Test {
u16: 1, i16: 2,
u32: 3, i32: 4,
u64: 5, i64: 6,
string: "String".into(),
Struct: Struct { f32: PI, f64: E, bytes: b"Vec<u8>".to_vec() },
list: vec![
Item { u8: 7, i8: -8 },
Item { u8: 9, i8: -10 },
],
};
let mut vec = to_vec((*b"GFF ").into(), &data).expect("can't write data");
// Важный нюанс - не забыть, что создание десериализатора читает заголовок и возвращает
// Result, а не сам десериализатор, поэтому требуется распаковка результата
let mut de = Deserializer::new(Cursor::new(vec)).expect("can't read GFF header");
let val = Value::deserialize(&mut de).expect("can't deserialize data");
println!("{:#?}", val);
}
依赖项
~3.5MB
~56K SLoC