Здравствуйте, Аноним, Вы писали:
А>А чем boost::serialize не подошёл?
А>Каюсь, сам был грешен, использовал собственный велосипед под названием BrokerStorage — использование типа :
А>MyBrokerStorage <<SomeObject1 ;
А>MyBrokerStorage <<SomeObject2 ;
А>MyBrokerStorage >> SomeFormat;
А>В boost то же универсальное описание сериализации для всех классов, но нет промежуточного хранилища.
А>Делаете простенький переходничёк в свой формат, можете оптимизировать с учётом специфики.
А>Или я чего не понял?
Отвечу под анонимом т.к. пока не получается востановить паролъ.
Во первых — спасибо что просмотрели статью.
Постараюсь коротко и лаконично ответить на Ваш вопрос.
Сразу оговорюсь о терминологии — "хранилище"(в статье) и "архив"(в бусте) — обозначают одну и ту же сущность.
Что касается промежуточного хранилища — те же яйца только в профиль

Продемонстрированный в статье
подход не обязывает вас использовать так называемый "промежуточный контейнер"(а именно вы наверное имели в виду временно загружаемые в память данные) — например в случае сериализации в реестр, никакие промежуточные данные не хранятся — все операции делигируются сразу в API операционной системы. Если вы хотите сохранять в сплошной кусок памяти именно моей реализации — тогда да, моя реализация хранилища(тот же архив — вид сбоку) предпологает раскручиваение древовидной структуры данных из упакованных структур в stl-ые ассоциативные массивы, что бы доступ по именам полей был быстрее и проще реализован.
Вы, если пожелаете, можете писать свою реализацию, оптимизируя по скорости/размеру если это актуально. Это вопрос организации хранилища(в бусте это обозначается терминов "архив").
А кроме того, точно так же в бусте вы создаёте "промежуточный экземпляр" архива:
//Пример из документации по бусту с http://www.boost.org/libs/serialization/doc/index.html
std::ifstream ifs("filename", std::ios::binary);//Создаётся провайдер потока данных - в данном случае из файла
boost::archive::text_iarchive ia(ifs);//Создаётся такой же промежуточный объект-хранилище
// read class state from archive
ia >> newg;//Загрузка данных из архива
Отсюда позвольте перейти к сути Вашего вопроса. Почему не boost::serialization ?.
В бусте сохраняемые объекты представляются последовательным потоком. Т.е. там
имеет значение последовательность элементов описанных в функции serialize(*).
В какой последовательности засунуты — в такой и высовываем. Как тока появляются разные версии, начинается самодеятельность с условными операторами:
//То же из примера с http://www.boost.org/libs/serialization/doc/index.html
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
// only save/load driver_name for newer archives
if(version > 0)
ar & driver_name;
ar & stops;
}
А я нехочу тратить время на постоянное согласовывание форматов версий.
Ну и кроме того, чисто субъективно:
a) мне не нравится когда простые операторы в с++ значат нетривиальные вещи: оператор "&" перегружен, и вызывает "<<" или ">>" хотя на первый взгляд выглядит как объявление ссылки(без инициализации правда

).
b) мне больше нравится писать\смотреть карту сериализации, чем функцию — легче писать, легче читать и видеть иерархию, минуя путанницу условных операторов согласования версий.