Как реализовать пользовательскую сериализацию только для serde_ json? - PullRequest
1 голос
/ 31 января 2020

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

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

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

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

1 Ответ

1 голос
/ 03 февраля 2020

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

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

pub struct StringableMyStruct(MyStruct);
...