Serialize third party library types
Many third party Rust crates already support serialization and deserialization
via the serde
crate. You just need to enable the serde
feature when you
declare the crate as dependency.
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
num-bigint = { version = "0.2", features = ["serde"] }
num = "0.2"
Note: Since the
serde
feature is not enabled on third party crates in the Rust Playground by default, the code examples in this article are not interactive. We will show the program output in the text. You can run these examples from this cargo project.
The example below shows how to serialize and deserialize a BigInt
struct type from the num_bigint
crate. It just works out of the box.
use num::bigint::ToBigInt;
use num_bigint::BigInt;
fn main() {
let a = 3.to_bigint().unwrap();
let x = num::pow(a, 247);
let xs = serde_json::to_string(&x).unwrap();
let xd: BigInt = serde_json::from_str(&xs).unwrap();
assert_eq!(x, xd);
println!("3**247 is {} and serializes to {}", x, xs);
}
Result
3**247 is 7062361041362837614435796717454722507454089864783271756927542774477268334591598635421519542453366332460075473278915787 and serializes to [1,[3323516107,3672165520,4080039719,3245710364,216105283,4292129601,4006727268,340573034,2851604588,3366124224,3797961372,1024846073,179]]
What about third party crates that are not yet to support the serde
feature?
The serde
crate provides another approach called remote derive. Basically, you create a local copy of the remote type
and then serialize the local type through a bridge. Check out the documentation.