Re[5]: Уменьшить объем сериализации
От: k732  
Дата: 20.06.08 07:46
Оценка:
Здравствуйте, Vinick, Вы писали:

V>Здравствуйте, k732, Вы писали:


K>>тоесть для сериализации понятно: если version = 0, то сериализуем весь объект, иначе только среднее значение (int)

K>>А вот при десереализации если 0, то опять весь контейнер, а вот если не 0, то нужно как-то проинициализировать объект руками.

K>>Вот здесь я просто не понял как

V>Не совсем понятно зачем инициализировать то что получателю не требуется. Может проще ввести в Averager поле m_avg и какой-нибудь флаг сигнализирующий о валидности этого поля.
V>Но если очень хочется иметь заполненый контейнер, то так:
V>
V>    template<class Archive>
V>    void save (Archive& archive, const unsigned int version) const
V>    {
V>        archive & version;
V>                archive & m_time;
V>                if(!version)
V>                   archive & m_values;
V>                else
V>                  {
V>                     archive & m_values.deque_size();
V>                     archive & m_values.avg();
V>                  }
V>    }
V>    template<class Archive>
V>    void load (Archive& archive, const unsigned int)
V>    {
V>                int version;
V>                archive & version;
V>        archive & m_time;
V>                if(!version)
V>                     archive & m_values;
V>                else
V>                   {
V>                       uint sz;
V>                       double avg;
V>                       archive & sz;
V>                       archive & avg;
V>                       m_values.avg(sz);
V>                       std::fill_(std::ostream_iterator<double>(m_values),sz,avg);
V>                       // или если сохранение размера не важно m_values << avg,
V>                       // тогда передавать m_values.deque_size() нет необходимости
V>                    }
V>    }
V>


спасибо. я правда уже немного по-другому сделал

    template<class Archive>
    void save (Archive& archive, const unsigned int version) const
    {
        archive << m_time;
        if (version)
        {
            TAverager temp (1);
            temp << m_values.avg();
            archive << temp;
        }
        else archive << m_power;
    }
    template<class Archive>
    void load (Archive& archive, const unsigned int version)
    {
        archive >> m_time;
        if (version)
        {
            TAverager temp (1);
            archive >> temp;
            m_values << temp.avg();
        }
        else archive >> m_power;
    }


я так понимаю, что осталось выбрать версию
BOOST_SERIALIZATION_SPLIT_MEMBER()
...
BOOST_CLASS_VERSION (Item, 1)

но получается, что это на этапе компиляции. Тоесть при сериализации всегда пойдет только усредненное значение.
А можно ли на этапе выполнения выбирать ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.