Rust Serde: десериализация XML напрямую в Vec <T> - PullRequest
1 голос
/ 26 октября 2019

Мне нужно использовать serde для сериализации некоторых данных XML. У данных есть шаблон, в котором имя тега во множественном числе (например, CATS, DOGS) будет содержать несколько экземпляров подтегей тега в единственном числе (CAT, DOG), как показано ниже:

<pets>
  <cats>
    <cat>
      <name>
          cat 1
      </name>
    </cat>
    <cat>
      <name>
          cat 2
      </name>
    </cat>
  </cats>
  <dogs>
    <dog>
      <name>
          dog 1
      </name>
    </dog>
    <dog>
      <name>
          dog 2
      </name>
    </dog>
  </dogs>
</pets>

Теперь я могудесериализовать это с помощью serde и serde-xml-rs:

use serde::{Serialize, Deserialize};
use serde_xml_rs;

#[derive(Debug, Serialize, Deserialize)]
struct Pets {
    pub cats: Cats,
    pub dogs: Dogs,
}

#[derive(Debug, Serialize, Deserialize)]
struct Cats {
    pub cat: Vec<Cat>,
}

#[derive(Debug, Serialize, Deserialize)]
struct Dogs {
    pub dog: Vec<Dog>,
}

#[derive(Debug, Serialize, Deserialize)]
struct Cat {
    name: String,
}

#[derive(Debug, Serialize, Deserialize)]
struct Dog {
    name: String,
}


fn main() {
    let s = xml_string_from_above;
    let pets: Pets = serde_xml_rs::from_str(s).unwrap();
    println!("{:#?}", pets);
}

Вопрос: Могу ли я использовать некоторый serde hack для удаления промежуточных структур Cats и Dogs и просто получитьнесколько экземпляров в векторе?

#[derive(Debug, Serialize, Deserialize)]
struct SlimmedPets {
    pub cats: Vec<Cat>,
    pub dogs: Vec<Dog>,
}

, при этом возвращая тот же XML при сериализации SlimmedPets struct?

...