Насколько мне известно, добавление дополнительных правил переименования в настоящее время невозможно. Что касается вашего первого вопроса, да, это макрос. Если вы посмотрите на код serde_derive
, вы увидите, что макрос использует RenameRule , которое является перечислением со всеми доступными правилами переименования.
Таким образом, вы не сможете использовать serde для достижения желаемого, но вместо этого вы можете написать свой собственный код сериализации и десериализации. Поэтому вместо того, чтобы создавать макрос, вы пишете его сами.
Пользовательский сериализатор будет выглядеть примерно так:
#[derive(Debug)]
struct Message {
foo_bar: String,
bar_foo: String
}
impl Serialize for Message {
fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
S: Serializer {
let mut state = serializer.serialize_struct("Message", 1)?;
state.serialize_field("Foo Bar", &self.foo_bar)?;
state.serialize_field("Bar Foo", &self.bar_foo)?;
state.end()
}
}
Создание десериализатора немного сложнее, но в документации serde
приведен пример здесь: Реализация десериализации вручную для структуры .
Здесь я создал полный рабочий пример: ржавая площадка