diff --git a/Cargo.toml b/Cargo.toml index 568554d..0ab5929 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ doc = true [features] default = ["std", "runtime-rng"] +serde = ["serde/derive"] # Enabling this will enable `AHashMap` and `AHashSet`. std = [] @@ -101,6 +102,7 @@ pcg-mwc = "0.2.1" serde_json = "1.0.59" hashbrown = "0.14.3" smallvec = "1.13.1" +bincode = "1.3.3" [package.metadata.docs.rs] rustc-args = ["-C", "target-feature=+aes"] diff --git a/src/random_state.rs b/src/random_state.rs index ec4fb18..57f9c91 100644 --- a/src/random_state.rs +++ b/src/random_state.rs @@ -1,4 +1,8 @@ use core::hash::Hash; + +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; + cfg_if::cfg_if! { if #[cfg(any( all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)), @@ -211,6 +215,7 @@ cfg_if::cfg_if! { /// |`with_seed` | Fixed per process |`u64` + static random number| /// |`with_seeds` | Fixed |`u64` x 4| /// +#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] #[derive(Clone)] pub struct RandomState { pub(crate) k0: u64, @@ -504,6 +509,20 @@ mod test { assert_ne!(PI, get_fixed_seeds()[0]); } + #[cfg(all(feature = "serde"))] + #[test] + fn test_serialize() { + let rs = RandomState::new(); + + let serialized = bincode::serialize(&rs).expect("failed to serialize"); + let deserialized: RandomState = bincode::deserialize(&serialized).expect("failed to deserialize"); + + assert_eq!(rs.k0, deserialized.k0); + assert_eq!(rs.k1, deserialized.k1); + assert_eq!(rs.k2, deserialized.k2); + assert_eq!(rs.k3, deserialized.k3); + } + #[cfg(all(feature = "compile-time-rng", any(not(feature = "runtime-rng"), test)))] #[test] fn test_not_pi_const() {