Как десериализовать две разные структуры и форматы файлов, используя toml-rs и serde_derive?

Я использую toml-rs и serde_derive для десериализации файлов TOML, которые мое приложение использует для описания структур данных.

У меня все работает с моей первой структурой данных, которая соответствует одному определению файла TOML с обязательными и необязательными полями.

Теперь я хочу использовать его для десериализации другой структуры данных, описанной в другом файле TOML, с другими полями.

Как указать десериализатору (я использую toml::from_str(&contents)), какой тип структуры я хочу десериализовать?

Связанный с этим вопрос - можно ли поместить тип в сам файл, чтобы десериализация могла быть более общей, а десериализатор мог определить тип для десериализации из самого файла?


person Andrew Mackenzie    schedule 22.11.2017    source источник
comment
Как мне указать десериализатору, в какой тип структуры я хочу десериализоваться? — вы делаете это точно так же, как вы указали, в какой тип десериализовать в первый раз. Покажите нам, как вы пытались решить проблему.   -  person Shepmaster    schedule 22.11.2017


Ответы (1)


toml::from_str десериализуется в тип, ожидаемый от выражения. Так

let x: Foo = toml::from_str(something)?;

будет использовать реализацию Deserialize из Foo.

Вы также можете явно указать, в какой тип десериализоваться, с помощью общих аргументов:

let x = toml::from_str::<Foo>(something)?;

Кроме того, связанно - можно ли поместить тип в сам файл, чтобы десериализация могла быть более общей, а десериализатор мог определить тип для десериализации из самого файла?

Вы можете сделать это с перечислениями. Каждый вариант может содержать другой тип. Чтобы определить точный дизайн, я предлагаю вам реализовать Serialize для перечисления, сериализовать его в ваш целевой формат, и вы увидите, как выполнить спецификацию типа во время выполнения. Я не уверен, что toml поддерживает перечисления, но json определенно поддерживает.

person oli_obk    schedule 22.11.2017
comment
Это отвечает на основную часть моего вопроса, поэтому я принял его. Я предполагаю, что часть, с которой я борюсь больше всего, на самом деле заключается в том, что я хочу десериализовать файл toml в один из нескольких различных типов структур, не зная априори, какой формат/тип находится в файле.... Если у вас есть какие-либо ссылки на идею перечисления было бы здорово. Если вы предпочитаете, чтобы я задал для этого отдельный вопрос, то я могу. Спасибо - person Andrew Mackenzie; 22.11.2017