Используя зерновые и ускорение сериализации в той же программе

В настоящее время у нас есть система, которая использует многократную сериализацию для хранения данных. Мы стремимся уйти от этого к использованию зерновых вместо этого.

Однако маловероятно, что мы сможем полностью перенести все сериализованные объекты. По крайней мере, мы сможем десериализовать старую версию данных.

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

Пример нашего кода:

class Base
{
public:
    std::string m_VarA;
    std::string m_VarB

    template<class Archive>
    void serialize(Archive & rArchive, const unsigned int nVersion)
    {
        rArchive & BOOST_SERIALIZATION_NVP(m_VarA);
        rArchive & BOOST_SERIALIZATION_NVP(m_VarB);
    }
};

class Derived : public Base
{
friend class boost::serialization::access;
public:
    std::bitset<32> m_Flags;
    template<class Archive>
    void serialize(Archive & rArchive, const unsigned int nVersion)
    {
        rArchive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base); 
        rArchive & BOOST_SERIALIZATION_NVP(m_Flags);        
    }    
};

std::ostringstream stream;
Derived var;
{
    boost::archive::xml_oarchive rArchive(stream);
    rArchive & boost::serialization::make_nvp("Configuration", var);
}

Я не думаю, что у нас есть что-то намного более сложное, чем это.

1 ответ

Я выйду на конечности и скажу "Да".

Библиотеки имеют сходство, но если они не сосуществуют, это будет ошибка в одной или обеих библиотеках.

Вы не показываете ЛЮБОЙ код, поэтому мы НИЧЕГО не знаем о том, как вы организовали ваш код сериализации.

Для любого подхода я могу представить пути миграции.

Самая важная вещь, которую нужно понять, это то, что действительный код сериализации должен быть видимым только в той точке, где происходит сериализация. Если вы ограничите это TU и сделаете все функции, задействованные в нем, статичными, вы будете в безопасности от акул¹.

Очевидно, вам будет лучше, если код сериализации будет ненавязчивым². Но даже если вы это сделаете, просто заставьте навязчивый метод передавать свободные функции, которые могут быть файловыми.

Святой Грааль: унифицированные функции сериализации

Это потребовало бы больше работы, очевидно, но кажется выполнимым с небольшим количеством метапрограммирования. На первый взгляд кажется, что проще реализовать Boost-сериализуемость из существующих функций сериализации Cerial, но, думаю, это не повезло.


Like акулы, такие как неоднозначные перегрузки или нарушения ODR

² /ɪnˈtruːsɪv/ прилагательное 1. вызывая срыв или раздражение...

Другие вопросы по тегам