Примечание:
Схема архива Boost основана на симметричных входных и выходных классах архива. Утомительно постоянно писать о них обоих, поэтому я буду использовать ?archive
для обозначения как oarchive
, так и iarchive
.
Резюме:
После изменения базовых классов моих пользовательских архивов с binary_?archive_impl
на text_?archive_impl
мои пользовательские классы архивов больше не «находятся», когда компилятор создает экземпляры методов serialize(...)
в других моих классах.
Фон:
Мое приложение успешно читало и записывало файлы на диск, используя подклассыbinary_?archive_impl
(документация и/или комментарии к коду рекомендуют это, а не производное отbinary_?archive
). Мне нужно было переключиться с двоичного формата файла на текстовый, поэтому я переключил базовые классы своих пользовательских архивов на text_?archive_impl
. Вот тогда все взорвалось.
Проблема:
Мои пользовательские классы архива добавляют функциональность, включая некоторые дополнительные методы, которых нет в их базовых классах Boost; эти методы вызываются в serialize(...)
методах многих моих классов, и они работали нормально . После изменения базовых классов с binary_?archive_impl
на text_?archive_impl
я повсюду получал ошибки компиляции с жалобами на то, что моих пользовательских методов не существует в text_?archive
. Ну это же очевидно (!!! ), но они существуют в моих пользовательских архивах, и они работали очень хорошо , когда я использовал бинарные базовые классы Boost. В чем дело?
Что я нашел,и мое временное -, но нежелательное -решение:
Вырвав на себе волосы и бродя по кругу около суток, я обнаружил вот что...
1 )Некоторое время назад (Boost 1.34 Кажется ), файлы "binary _?archive.hpp" были разделены на "binary _?archive _impl.hpp" и " двоичный _?archive.hpp" (последний #включает первый ). Это не было сделано для "текста _?archive.hpp". (В результате я изменил включаемые строки моего приложения #с «binary _?archive _impl.hpp» на просто «text _?archive.hpp».)
2 )Если я разделю "текст _?archive.hpp" на две части и #включу только заголовки "... _impl.hpp", все будет работать. (Но я действительно не хочу модифицировать свою установку Boost!)
3 )Посмотрев более внимательно на эти заголовки и немного повозившись с ними, я обнаружил, что если использовать исходные немодифицированные заголовки и закомментировать строку
BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)
(и аналогично дляtext_iarchive
), то все снова работает нормально. (Кстати, у меня есть похожие строки в коде моего собственного архива для "регистрации" моих пользовательских архивов.)
Тайна и моя дилемма:
A )Почему наличие этих линий портит работу?... и почему их удаление заставляет вещи работать?...и что я мог сломать (, не подозревая об этом ), сделав это?
B )Почему «текстовые _?archive.hpp» файлы не были разделены вместе с «двоичными _?archive.hpp» файлами давным-давно? (Библиотека сломана? Это должно быть исправлено?)
C )Есть ли способ решить эту проблему в моем коде приложения без изменения моей установки Boost?
P.S. Я использую Boost 1.48 и Visual Studio 2010 (64 -бит)
П.П.С.Я полагаю, что все вышеперечисленное в равной степени применимо кtext_w?archive