pub struct FromInto<T>(/* private fields */);
Expand description
Serialize value by converting to/from a proxy type with serde support.
This adapter serializes a type O
by converting it into a second type T
and serializing T
.
Deserializing works analogue, by deserializing a T
and then converting into O
.
struct S {
#[serde_as(as = "FromInto<T>")]
value: O,
}
For serialization O
needs to be O: Into<T> + Clone
.
For deserialization the opposite T: Into<O>
is required.
The Clone
bound is required since serialize
operates on a reference but Into
implementations on references are uncommon.
Note: TryFromInto
is the more generalized version of this adapter which uses the TryInto
trait instead.
§Example
#[derive(Clone, Debug, PartialEq)]
struct Rgb {
red: u8,
green: u8,
blue: u8,
}
impl From<(u8, u8, u8)> for Rgb { ... }
impl From<Rgb> for (u8, u8, u8) { ... }
#[serde_as]
#[derive(Deserialize, Serialize)]
struct Color {
#[serde_as(as = "FromInto<(u8, u8, u8)>")]
rgb: Rgb,
}
let color = Color {
rgb: Rgb {
red: 128,
green: 64,
blue: 32,
},
};
// Define our expected JSON form
let j = json!({
"rgb": [128, 64, 32],
});
// Ensure serialization and deserialization produce the expected results
assert_eq!(j, serde_json::to_value(&color).unwrap());
assert_eq!(color, serde_json::from_value(j).unwrap());
Trait Implementations§
Source§impl<'de, T, U> DeserializeAs<'de, T> for FromInto<U>where
U: Into<T> + Deserialize<'de>,
impl<'de, T, U> DeserializeAs<'de, T> for FromInto<U>where
U: Into<T> + Deserialize<'de>,
Source§fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>where
D: Deserializer<'de>,
Source§impl<T, U> SerializeAs<T> for FromInto<U>
impl<T, U> SerializeAs<T> for FromInto<U>
Source§fn serialize_as<S>(source: &T, serializer: S) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(source: &T, serializer: S) -> Result<S::Ok, S::Error>where
S: Serializer,
Auto Trait Implementations§
impl<T> Freeze for FromInto<T>
impl<T> RefUnwindSafe for FromInto<T>where
T: RefUnwindSafe,
impl<T> Send for FromInto<T>where
T: Send,
impl<T> Sync for FromInto<T>where
T: Sync,
impl<T> Unpin for FromInto<T>where
T: Unpin,
impl<T> UnwindSafe for FromInto<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 0 bytes