Пользовательский сериализатор Serde

#rust #serde

Вопрос:

Я следую руководству по реализации сериализатора с serde помощью . Это дает базовую реализацию сериализатора JSON с использованием Serde. Скажите , что я хочу сериализовать только целые числа u8 без знака, u16 и u32 . Можно ли как-то указать это ограничение и выдавать ошибки всякий раз , когда пользователь пытается сериализовать любой другой тип, например string , f32 и т. Д. ?

Я, наверное, мог бы написать

 fn serialize_string(self, v: string) -> Result<()> {
    return Err(Error::Message("Undefined".to_owned()));
}

fn serialize_f32(self, v: f32) -> Result<()> {
    return Err(Error::Message("Undefined".to_owned()));
}

/* and so forth */
 

Но это кажется слишком многословным.

И можно ли определить протокол для сериализации пользовательских типов? Например, у меня может быть структура Point , содержащая две координаты x и y . Я хочу сериализовать Point в сжатом формате, как описано здесь: https://bitcoin.stackexchange.com/a/84588, Т. е. сериализуйте первую x координату как любое другое целое число без знака, но добавьте небольшой префикс, чтобы указать, y четная или нечетная координата. Затем можно вывести y из x , используя префикс (условный).