Сериализация / десериализация структуры до XML с использованием зерновых без изменения интерфейса структуры - PullRequest
0 голосов
/ 04 мая 2020

Моя ситуация выглядит следующим образом, в рамках тестирования интерфейса API мне нужно сохранить некоторые ссылки (структуру и векторы структур) как XML. Сохраненный файл XML в конечном итоге будет использоваться для извлечения ссылочной структуры и сравнения с текущим состоянием. Я ищу библиотеку, которая могла бы помочь мне решить эту проблему, и обнаружил, что библиотека зерновых кажется хорошим вариантом.

Я просто нахожу, что пишу много стандартного кода, и задаюсь вопросом, использую ли я эту библиотеку так, как мне хотелось бы? он предназначен для.

Пример: я хочу сериализовать структуру A из API, поскольку я не могу изменить A напрямую, чтобы добавить метод сериализации, мне нужно создать структуру B, которая наследуется от A по порядку сериализовать все атрибуты A.

struct A {
    int foo;
    float bar;
    std::string some_text;
};

struct B: public A {
    template <class Archive>
    void serialize( Archive & ar)
    {
        ar(cereal::make_nvp("foo", foo));
        ar(cereal::make_nvp("bar", bar));
        ar(cereal::make_nvp("some_text", some_text));
    }
};

1) Это правильный способ использования хлопьев?

2) Есть ли лучший способ или другая библиотека, которая позволила бы мне иметь тот же результат с меньшим количеством стандартного кода? (Помните, что существует довольно много структур, которые необходимо сериализовать)

Примечание: структуры могут быть вложены в другие структуры из того же API.

1 Ответ

0 голосов
/ 04 мая 2020

Лучшее решение, которое я нашел, чтобы максимально сократить код шаблона, - это действовать следующим образом (для того же примера):

struct A {
    int foo;
    float bar;
    std::string some_text;
};

namespace cereal
{
    template<class Archive>
    void serialize( Archive & ar, A & data )
    {
        ar(cereal::make_nvp("foo", data.foo)); // or even ar(CEREAL_NVP(data .foo)) if you don't mind the name being 'data.foo'
        ar(cereal::make_nvp("bar", data .bar));
        ar(cereal::make_nvp("some_text", data .some_text));
    }
}

Несмотря на то, что документация, по-видимому, не реализует это, way Специализирующийся на архиве

Если у кого-то есть лучший способ сделать это, я все еще ищу лучшее решение.

...