Implementation of struct to bytes conversion and vice versa using serde framework
Before using, make sure to add serde in your Cargo.toml
[dependencies]
serde = { version = "1.0", features = ["derive"] }
#[derive(Serialize, Deserialize)]
struct Employee {
name: String,
}
#[derive(Serialize, Deserialize)]
struct Company {
name: String,
employees: Vec<Employee>,
}
let company = Company {
name: String::from("Walter White Company"),
employees: vec![Employee {
name: String::from("Jesse Pinkman"),
}],
};
let bytes = ser::to_bytes(&company).unwrap();
#[derive(Serialize, Deserialize)]
struct Employee {
name: String,
}
#[derive(Serialize, Deserialize)]
struct Company {
name: String,
employees: Vec<Employee>,
}
// Suppose you have a chunk of bytes here
let company: Company = de::from_bytes(&bytes).unwrap();
The produced output will be in a packed struct format. For strings or sequences, there will be 2 bytes of padding indicating their size or length. However, you can customize your own padding format by using FormatOptions
.
pub struct FormatOptions {
pub short_length: bool,
pub short_variant_index: bool,
}
short_length
:
- If
true
, strings or sequences size padding will be in 2 bytes - If
false
, strings or sequences size padding will be in 4 bytes
short_variant_index
:
- If
true
, enum index padding will be in 2 bytes - If
false
, enum index padding will be in 4 bytes
Note that you need to call se::to_bytes_with_options
/ de::from_bytes_with_options
instead of se::to_bytes
/ de::from_bytes