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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Так вот если усреднять по очень большому числу значений, то сериализуется весь 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, 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; — понятия не имею, предполагаю что низачем.