Well, a custom Serializer
would never be necessary. A custon Serialize
implementation is an option. Taking inspiration from this example from the serde docs
use serde::ser::{Serialize, Serializer, SerializeStruct};
struct Color {
r: u8,
g: u8,
b: u8,
}
impl Serialize for Color {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
// 3 is the number of fields in the struct.
let mut state = serializer.serialize_struct("Color", 3)?;
state.serialize_field("r", &self.r)?;
state.serialize_field("g", &self.g)?;
state.serialize_field("b", &self.b)?;
state.end()
}
}
and also comparing with the output of cargo expand
on this example which doesn't seem to do anything more either
#[automatically_derived]
impl _serde::Serialize for Filter {
fn serialize<__S>(&self, __serializer: __S)
-> _serde::__private::Result<__S::Ok, __S::Error> where
__S: _serde::Serializer {
let mut __serde_state =
match _serde::Serializer::serialize_struct(__serializer,
"Filter", false as usize + 1 + 1) {
_serde::__private::Ok(__val) => __val,
_serde::__private::Err(__err) => {
return _serde::__private::Err(__err);
}
};
match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
"locationIds", &self.location_ids) {
_serde::__private::Ok(__val) => __val,
_serde::__private::Err(__err) => {
return _serde::__private::Err(__err);
}
};
match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
"categoryIds", &self.category_ids) {
_serde::__private::Ok(__val) => __val,
_serde::__private::Err(__err) => {
return _serde::__private::Err(__err);
}
};
_serde::ser::SerializeStruct::end(__serde_state)
}
}
it looks like such a custom implementation would be fairly straightforward: The derived impl above should be equivalent to
impl Serialize for Filter {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("Filter", 2)?;
state.serialize_field("locationIds", &self.location_ids)?;
state.serialize_field("categoryIds", &self.category_ids)?;
state.end()
}
}
and adding the additional entry is straightforward:
impl Serialize for Filter {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("Filter", 3)?;
state.serialize_field("locationIds", &self.location_ids)?;
state.serialize_field("categoryIds", &self.category_ids)?;
state.serialize_field("isEmpty", &self.is_empty())?;
state.end()
}
}