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