Так вот если усреднять по очень большому числу значений, то сериализуется весь std::deque.
В результате получаются килобайты, ходя реально интерисует время и усредненное значение (тоесть несколько байт).
Сам дек целиком нужен лишь с одной стороны. Если его передать, сереализовав данные, то на другой нужно лишь усредненное.
Можно ли как сделать, чтоб при сериализации бралось лишь усредненное значение, а при десериализации оно и использовалось для инициализации дека ?
P.S. И хотелось бы это сделать не как в Averager, так и в Item (тоесть двумя способами на выбор)
Здравствуйте, k732, Вы писали: K>Сам дек целиком нужен лишь с одной стороны. Если его передать, сереализовав данные, то на другой нужно лишь усредненное. K>Можно ли как сделать, чтоб при сериализации бралось лишь усредненное значение, а при десериализации оно и использовалось для инициализации дека ?
Здравствуйте, Vinick, Вы писали:
V>Здравствуйте, k732, Вы писали: K>>Сам дек целиком нужен лишь с одной стороны. Если его передать, сереализовав данные, то на другой нужно лишь усредненное. K>>Можно ли как сделать, чтоб при сериализации бралось лишь усредненное значение, а при десериализации оно и использовалось для инициализации дека ?
V>А если разделить чтение и запись как здесь V>Splitting serialize into save/load
И не забываем про второй параметр метода serialize
пускай если version = 1, то сериализуем среднее иначе весь объект
Здравствуйте, agolubtsov, Вы писали:
A>Здравствуйте, Vinick, Вы писали:
V>>Здравствуйте, k732, Вы писали: K>>>Сам дек целиком нужен лишь с одной стороны. Если его передать, сереализовав данные, то на другой нужно лишь усредненное. K>>>Можно ли как сделать, чтоб при сериализации бралось лишь усредненное значение, а при десериализации оно и использовалось для инициализации дека ?
V>>А если разделить чтение и запись как здесь V>>Splitting serialize into save/load
A>И не забываем про второй параметр метода serialize A>пускай если version = 1, то сериализуем среднее иначе весь объект
ну впринципе идея понятна. Только
1. Как сериализатору указать версию (желательно, чтоб полностью сериализовалось по умолчанию)
2. Я так понимаю, что нужно что-то вроде
тоесть для сериализации понятно: если version = 0, то сериализуем весь объект, иначе только среднее значение (int)
А вот при десереализации если 0, то опять весь контейнер, а вот если не 0, то нужно как-то проинициализировать объект руками.
Здравствуйте, k732, Вы писали:
K>тоесть для сериализации понятно: если version = 0, то сериализуем весь объект, иначе только среднее значение (int) K>А вот при десереализации если 0, то опять весь контейнер, а вот если не 0, то нужно как-то проинициализировать объект руками.
K>Вот здесь я просто не понял как
Не совсем понятно зачем инициализировать то что получателю не требуется. Может проще ввести в Averager поле m_avg и какой-нибудь флаг сигнализирующий о валидности этого поля.
Но если очень хочется иметь заполненый контейнер, то так:
template<class Archive>
void save (Archive& archive, const unsigned int version) const
{
archive & version;
archive & m_time;
if(!version)
archive & m_values;
else
{
archive & m_values.deque_size();
archive & m_values.avg();
}
}
template<class Archive>
void load (Archive& archive, const unsigned int)
{
int version;
archive & version;
archive & m_time;
if(!version)
archive & m_values;
else
{
uint sz;
double avg;
archive & sz;
archive & avg;
m_values.avg(sz);
std::fill_(std::ostream_iterator<double>(m_values),sz,avg);
// или если сохранение размера не важно m_values << avg,
// тогда передавать m_values.deque_size() нет необходимости
}
}
Здравствуйте, Vinick, Вы писали:
V>Здравствуйте, k732, Вы писали:
K>>тоесть для сериализации понятно: если version = 0, то сериализуем весь объект, иначе только среднее значение (int) K>>А вот при десереализации если 0, то опять весь контейнер, а вот если не 0, то нужно как-то проинициализировать объект руками.
K>>Вот здесь я просто не понял как V>Не совсем понятно зачем инициализировать то что получателю не требуется. Может проще ввести в Averager поле m_avg и какой-нибудь флаг сигнализирующий о валидности этого поля. V>Но если очень хочется иметь заполненый контейнер, то так: V>
я так понимаю, что осталось выбрать версию
BOOST_SERIALIZATION_SPLIT_MEMBER()
...
BOOST_CLASS_VERSION (Item, 1)
но получается, что это на этапе компиляции. Тоесть при сериализации всегда пойдет только усредненное значение.
А можно ли на этапе выполнения выбирать ?
Здравствуйте, Vinick, Вы писали:
V>Здравствуйте, k732, Вы писали:
K>>тоесть для сериализации понятно: если version = 0, то сериализуем весь объект, иначе только среднее значение (int) K>>А вот при десереализации если 0, то опять весь контейнер, а вот если не 0, то нужно как-то проинициализировать объект руками.
K>>Вот здесь я просто не понял как V>Не совсем понятно зачем инициализировать то что получателю не требуется. Может проще ввести в Averager поле m_avg и какой-нибудь флаг сигнализирующий о валидности этого поля. V>Но если очень хочется иметь заполненый контейнер, то так: V>
Здравствуйте, Vinick, Вы писали:
V>Здравствуйте, k732, Вы писали:
K>>и зачем сериализовать саму версию ? V>А как получатель узнает о том какой объект лежит в архиве?
Понятно. Принимается...
Есть еще вопросы
1. Почему я не могу сериализовать данные контейнера.
Сериализация зависит от версии. Ее нужно задать как
BOOST_CLASS_VERSION (SomeClass, version)
Для нешаблонных классов получается задавать версию, но Averager шаблонный и не понятно как для него вызвать
BOOST_CLASS_VERSION. Тоесть нужно как-то указать для всех типов.
Здравствуйте, agolubtsov, Вы писали:
A>И не забываем про второй параметр метода serialize A>пускай если version = 1, то сериализуем среднее иначе весь объект
Проблема в том, что версия записывается только один раз на тип. И в этом заключается большая подстава.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, agolubtsov, Вы писали:
A>>И не забываем про второй параметр метода serialize A>>пускай если version = 1, то сериализуем среднее иначе весь объект
NBN>Проблема в том, что версия записывается только один раз на тип. И в этом заключается большая подстава.
Ну пусть хоьб 1 раз. Но проблемма в шаблонном классе. Можно ли ее разрешить ?
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, k732, Вы писали:
NBN>А если ввести флажок — обозначающий содержимое твоего Averager и при необходимости итема: NBN>
Здравствуйте, k732, Вы писали:
K>Если да, то где сейчас все тусуются, если нет, то где кипящая жизнь, обмен опытом...
Да просто все тебя жалеют и не дают советы, типа, выпрями таки дизайн и сделать так, чтобы сериализация была отдельно, а модификация данных отдельно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
NikeByNike пишет:
> S>Попробуй ченить в таком роде: > S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто > > Версия сохраняется только один раз, поэтому в общем случае её лучше > применять для именно версионных целей.
Я честно говоря не разбирался, для чего там k732 версию применять
пытается. Понял, что она нужна для шаблонного класса, заглянул в
исходники и написал как ее на мой взгляд можноь применить не к классу, а
к шаблону — эта задача, по-моему, может не только у него возникнуть.
А уж будет в нее k732 собственно версию класть или какие-то левые
извраты, меня не касается.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
k732 пишет:
> S>namespace boost { namespace serialization { > S>template<typename T, unsigned int X> struct version<Averager<T, X> > > S>{ > S> typedef mpl::int_<20> type; > S> typedef mpl::integral_c_tag tag; > S> BOOST_STATIC_CONSTANT(unsigned int, value=version::type::value); > S>}; > S>}} > S> > > > > S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто > S> > > S>namespace boost { namespace serialization { > S>template<typename T, unsigned int X> struct version<Averager<T, X> > > S>{ > S> enum { value = 20}; > S>}; > S>}} > S> > > > > большое тебе человеческое. Вроде сработало > Правда не совсем понятно зачем так сложно пришлось и что это означает (в > смысле объяснения)
Ну вообще если посмотреть в файл version.hpp, то там написано:
namespace boost {
namespace serialization {
struct basic_traits;
// default version number is 0. Override with higher version
// when class definition changes.template<class T>
struct version
{
template<class U>
struct traits_class_version {
typedef BOOST_DEDUCED_TYPENAME U::version type;
};
typedef mpl::integral_c_tag tag;
// note: at least one compiler complained w/o the full qualification
// on basic traits belowtypedef
BOOST_DEDUCED_TYPENAME mpl::eval_if<
is_base_and_derived<boost::serialization::basic_traits,T>,
traits_class_version<T>,
mpl::int_<0>
>::type type;
BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
};
} // namespace serialization
} // namespace boost
Означает это, как и написано в комменте, что по дефолту версия равна 0.
Т.е., выражение boost::serialization::version<some_type>::value имеет
значение 0, если не определена соответствующая специализация. Макрос
как раз и определяет такую специализацию. Соответственно, чтобы задать
версию для шаблона, можно написать частичную специализацию структуры
version — это код который я приводил в прошлый раз.
Зачем нужны typedef mpl::int_<N> type; и typedef mpl::integral_c_tag
tag; — понятия не имею, предполагаю что низачем.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Sergey, Вы писали:
S>k732 пишет:
>> S>namespace boost { namespace serialization { >> S>template<typename T, unsigned int X> struct version<Averager<T, X> > >> S>{ >> S> typedef mpl::int_<20> type; >> S> typedef mpl::integral_c_tag tag; >> S> BOOST_STATIC_CONSTANT(unsigned int, value=version::type::value); >> S>}; >> S>}} >> S> >> >> >> >> S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто >> S> >> >> S>namespace boost { namespace serialization { >> S>template<typename T, unsigned int X> struct version<Averager<T, X> > >> S>{ >> S> enum { value = 20}; >> S>}; >> S>}} >> S> >> >> >> >> большое тебе человеческое. Вроде сработало >> Правда не совсем понятно зачем так сложно пришлось и что это означает (в >> смысле объяснения)
S>Ну вообще если посмотреть в файл version.hpp, то там написано: S>
S>namespace boost {
S>namespace serialization {
S>struct basic_traits;
S>// default version number is 0. Override with higher version
S>// when class definition changes.
S>template<class T>
S>struct version
S>{
S> template<class U>
S> struct traits_class_version {
S> typedef BOOST_DEDUCED_TYPENAME U::version type;
S> };
S> typedef mpl::integral_c_tag tag;
S> // note: at least one compiler complained w/o the full qualification
S> // on basic traits below
S> typedef
S> BOOST_DEDUCED_TYPENAME mpl::eval_if<
S> is_base_and_derived<boost::serialization::basic_traits,T>,
S> traits_class_version<T>,
S> mpl::int_<0>
>>::type type;
S> BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
S>};
S>} // namespace serialization
S>} // namespace boost
S>
S>Означает это, как и написано в комменте, что по дефолту версия равна 0. S>Т.е., выражение boost::serialization::version<some_type>::value имеет S>значение 0, если не определена соответствующая специализация. Макрос
S>
S>как раз и определяет такую специализацию. Соответственно, чтобы задать S>версию для шаблона, можно написать частичную специализацию структуры S>version — это код который я приводил в прошлый раз.
S>Зачем нужны typedef mpl::int_<N> type; и typedef mpl::integral_c_tag S>tag; — понятия не имею, предполагаю что низачем.