Вот что я сделал в конце.Поскольку Ник прав, и это действительно нецелевое использование, сначала нужно отключить отслеживание указателя.В противном случае можно получить поддельные общие объекты.Следовательно, для начала, загрузки
BOOST_CLASS_TRACKING(yourDerivedClass,boost::serialization::track_never)
Я также остановился только на регистрации объектов, которые происходят от одного и того же базового объекта (вы можете просто создать для этого пустую виртуальную базу).Как только это будет сделано, важно убедиться, что оно выглядит абстрактным (я позаботился о том, чтобы иметь виртуальные деструкторы, и все же добавил
BOOST_SERIALIZATION_ASSUME_ABSTRACT(yourBaseClass)
Зарегистрировать все производные классы в архиве после его создания (оба пишути прочитайте)
arMsgs.template register_type<yourDerivedClass>();
Зарегистрируйте только конечный неабстрактный класс (если A наследуется от B и C, а не B). По крайней мере, для любого зарегистрированного класса необходимо отключить отслеживание.
Наконец, добавьте их в архив по мере их поступления.
Чтобы перезагрузить их, вместо использования специального токена для конца файла, который потребует проверки, я выбрал
try
{
for(;;)
{
yourBaseClass obj;
arObjs >> boost::serialization::make_nvp("Obj",obj);
//your logic
}
}
catch(boost::archive::archive_exception const& e) { }
Это может отловить слишком много, поэтому могут потребоваться дополнительные проверки, но это работает для меня. Преимущество заключается в том, что правильное завершение не так важно, например, если ваше приложение дает сбой в середине, вы все равно можете выполнить допоследнее читаемое сообщение.