Serialization
The most common format for serialization and deserialization is JSON. Each type in our qFALL-math supports serialization and deserialization using serde_json.
use qfall_math::integer::Z;
fn serialize_and_deserialize_z() {
let int = Z::from(17);
let string = serde_json::to_string(&int).unwrap();
let string_int = "{\"value\":\"17\"}";
let z_deserialized: Z = serde_json::from_str(string_int).unwrap();
}
This principle can be applied to all types but is especially useful if we want to create new structs which correspond to cryptographic constructions. If all parts of a struct are serializable, then the struct can be derived as serializable and no new implementation is needed:
use qfall_math::{integer::Z, rational::Q};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct SerializableStruct {
integer: Z,
rational: Q,
}
That allows for immediate serialization and deserialization of newly created constructions. Serialization is also implementable for more complicated structs. In qFALL-crypto we also utilized typetags that allow for easy serialization and deserialization of traits or, more precisely, the structs implementing the trait.