Как реализовать кастомную сериализацию только для serde_json?

Я хочу иметь возможность сериализовать Vec<u8> как строку в кодировке base64 для JSON (и других форматов на основе UTF-8), сохраняя при этом массив байтов для двоичных форматов сериализации.

#[derive(Serialize, Deserialize)]
struct MyStruct {
    binary_data: Vec<u8>,
}

По умолчанию serde_json сериализует поле binary_data как массив чисел. Вместо этого я хочу, чтобы он был сериализован как строка, закодированная с помощью base64. Тем не менее, я хочу сохранить двоичный код (или любой другой двоичный формат) с использованием необработанных байтов и избежать преобразования base64.

Единственное решение, которое я придумал, - это создать копию структуры данных специально для сериализатора, но это действительно раздражает и неэффективно, когда у вас есть вложенные структуры.


person Vlad Frolov    schedule 31.01.2020    source источник


Ответы (1)


Основываясь на документации Derde, вы не можете предоставить специальную реализацию признака Serialize для конкретного сериализатора для той же структуры.

Вы можете создать структуру newtype, а затем предоставить настраиваемую serde::{Des,S}erialize реализацию для StringableMyStruct для поддержки String в полях:

pub struct StringableMyStruct(MyStruct);
person MaxV    schedule 03.02.2020
comment
Хотя это не решило мою проблему, похоже, это единственный ответ, который я могу получить. Спасибо, что подтвердили мои подозрения. - person Vlad Frolov; 06.02.2020