Получение пользовательских классов архивов из boost ::archive ::text _oarchive _impl и boost ::archive ::text _iarchive _impl

Примечание:
Схема архива 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

10
задан aldo 21 May 2012 в 20:45
поделиться