Аннотация:
В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.
Здравствуйте, Sergeem, Вы писали:
S>это они так журнал продвигают, чтоб его покупали. S>я не гордый, подожду пол-года.
[опять же OFF]
(с чувством глубокого морального удовлетворения): — Пусть, пусть эти придурки выделываются, кропают свои статьишки, выпускают свои журнальчики! Мы, русские люди, кушаем только бесплатное!
Здравствуйте, Sergeem, Вы писали:
S>это они так журнал продвигают, чтоб его покупали. S>я не гордый, подожду пол-года.
Разве полгода? А мне казалось быстрее. Я, кстати, rsdn magazine ни разу не покупал, так как ни разу не видел в продаже, а заказывать... мне как-то неловко, чтобы из-за меня человек в лютую непогоду по улице бегал, такое вот у меня небуржуйское воспитание... ( эй, я никого не осуждаю, спрячьте свои шотганы )
А не в непогоду как глупо заказывать, человек с удовольствием прогуляется по свежему воздуху, а ему деньги за это плати...
РМ>Разве полгода? А мне казалось быстрее. Я, кстати, rsdn magazine ни разу не покупал, так как ни разу не видел в продаже, а заказывать... мне как-то неловко, чтобы из-за меня человек в лютую непогоду по улице бегал,
это где так? (или шутишь?)
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Здраствуйте, Shire. Вы писали:
S> Подобное решение есть у Константина Книжника
Давненько я на его сайт не заглядывал, но насколько мне помнится, Книжник реализовал reflection на основе run-time классов (наподобие MFCшного CRuntimeClass). Подход же описанный в статье, основан на шаблонах. Первый раз такое решение я увидел в XTL
Здравствуйте, Андрей Мартынов АМ>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.
Не удалось собрать под VC++ 6.0.
Ошибка:
error C2629: unexpected 'struct Rsdn::Serializer::FieldAttrubutes::StructFieldAttrubute<StructType,StructFieldType> ('
Здравствуйте, Андрей Мартынов, Вы писали:
АМ>Статья:
АМ>Авторы: АМ> Андрей Мартынов
АМ>Аннотация: АМ>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.
где объявлены и для чего используются
CT2A()
CW2T()
Здравствуйте, nobody2, Вы писали:
N>Здравствуйте, Андрей Мартынов, Вы писали:
АМ>>Статья:
АМ>>Авторы: АМ>> Андрей Мартынов
АМ>>Аннотация: АМ>>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.
N>где объявлены и для чего используются N>CT2A() N>CW2T()
Это макросы преобразования строк в ATL, сокращения от ConstTchar2Ansi и ConstWide2Tchar.
Смотри в MSDN T2A и W2T
Здравствуйте, romashka, Вы писали:
R>Здравствуйте, Андрей Мартынов АМ>>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.
R>Не удалось собрать под VC++ 6.0. R>Ошибка: R> error C2629: unexpected 'struct Rsdn::Serializer::FieldAttrubutes::StructFieldAttrubute<StructType,StructFieldType> ('
R>В строке:
>>> StructFieldAttrubute( FieldName name R> , StructFieldType StructType::* offset R> , const StructFieldType* pDefault = NULL R> , const Layout<StructFieldType>& layout = DefaultLayout<StructFieldType>() R> ) R> : m_layout(layout) R> , m_name(name) R> , m_offset(offset) R> , m_pDefault(pDefault) R> {}
R>В статье не сказано об ограничения для платформы. R>В силу ограничений могу использовать только VC 6.0, а данное решение мне очень кстати.
Те же грабли и с VC 7.0. Проблема в использовании в качестве дефолтного значения шаблонной функции.
которая, в свою очередь, возвращает объект StructClassMeta<std::vector<int> >, который при создании инициализируется объектом, создаваемым функцией DefaultLayout<std::vector<int> >()
Здравствуйте, Андрей Мартынов, Вы писали:
АМ>Статья:
АМ>Авторы: АМ> Андрей Мартынов
АМ>Аннотация: АМ>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.
Можете запинать меня ногами, мне понравилось... И дело не в названиях классов или еще в чем-либо, а в самом решении. Тем более это open source, дорабатывай сколько влезет, если это необходимо.
Species come and go, but the earth stands forever fast...
Здравствуйте, Salex100, Вы писали:
S>Здравствуйте, Андрей Мартынов, Вы писали:
S>Попытался рикрутить к WTL контролу (диалоговое окно). После загрузки конфигурации приложение с грохотом падает.
S>Хотя с моими классами работает!
Причина найдена. В функции Load есть следуящая строчка:
Тут я вижу бы ли заданы вопросы оставленные без ответа
касательно ошибок при переносе кода на VC версиями ниже 8.0
error C2629: unexpected 'Rsdn::Serializer::FieldAttrubutes::StructFieldAttrubute<StructType,StructFieldType> ('
error C2334: unexpected token(s) preceding '{'; skipping apparent function body
error C2664: 'Rsdn::Serializer::MetaClasses::StructClassMeta<struct Clr>::__ctor' : cannot convert parameter 1 from 'Clr_Layout3'
хотелось бы все таки знать, как убрать эти ошибки
спасибо.
Здравствуйте, Libra, Вы писали:
L>Можете запинать меня ногами, мне понравилось... И дело не в названиях классов или еще в чем-либо, а в самом решении. Тем более это open source, дорабатывай сколько влезет, если это необходимо.
Да, нет понимаешь, идея какая-то промежуточная. Потому что если храним всё в CRuntimeClass требуем наследования от него и проч., то тогда надо использовать RTTI и не придумывать свои LayoutDefault. Если же используем шаблоны, то вся информация наобходимая для сериализации может быть получена ещё на этапе компиляции за счёт 1000 и 1 раз перегруженных функций и опять не нужен LayoutDefault. А то что мы имеет это дублирование RTTI. Нет, как продукт очень даже ничего, но как идея лично мне не нравится, хотя не буду отрицать полезность таких идей и не буду отричать, что то чем я сейчас пользуюсь было написано в том числе и после прочтения этой статьи.
Здравствуйте, Андрей Мартынов, Вы писали:
АМ>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.
а чего надо подкрутить, чтоб можно было с полями типа CString работать, типа так:
struct Clr
{
CString str;struct LayoutDefault : public Layout<Clr>
{
LayoutDefault()
{ // тег поле значение по умолчанию
Simple(_T("STRING" ), &Clr::str, "default string");
}
};
};
struct a
{
int i;
int j;
struct LayoutDefault : public Layout<Clr>
{
LayoutDefault()
{ // тег поле значение по умолчанию
Simple(_T("VarI" ), &a::i, 10);
Simple(_T("VarJ" ), &a::j, 10);
}
};
}
struct b : public a
{
int x;
int y;
????????????????
}
Здравствуйте, Macedonian, Вы писали:
M>При сборке обнаружились утечки памяти в нескольких местах, кто-нибудь это уже исправлял?
Я много чего уже исправил в этом коде, правда утечек не помню. Так что пример кода вызывающий утечку в студию, а там посмотрим.
Последний баг который я нашел, это проблема с ексепшенами:
struct Exception : public std::exception
{
Exception(const tstring& a_msg) : msg(a_msg) {}
const char *what() const
{ return CT2A(msg.c_str()); } // what вернет указатель на временный объект, который уже будет удален к моменту выхода из функцииprotected:
const tstring& msg;
};
Здравствуйте, CiViLiS, Вы писали:
M>>При сборке обнаружились утечки памяти в нескольких местах, кто-нибудь это уже исправлял? CVL>Я много чего уже исправил в этом коде, правда утечек не помню. Так что пример кода вызывающий утечку в студию, а там посмотрим.
Извини, что долго не отвечал, сессия )-:
Утечку вызывает код парсинга Xml, помещенный в MFC DLL, причем в консольном приложении тот же код не вызывает у компилятора подозрений в утечке
Собственно, код:
Здравствуйте, Macedonian, Вы писали:
M>Здравствуйте, CiViLiS, Вы писали:
M>>>При сборке обнаружились утечки памяти в нескольких местах, кто-нибудь это уже исправлял? CVL>>Я много чего уже исправил в этом коде, правда утечек не помню. Так что пример кода вызывающий утечку в студию, а там посмотрим.
M>Извини, что долго не отвечал, сессия )-:
А я уже как год забыл про это страшное слово
M>Утечку вызывает код парсинга Xml, помещенный в MFC DLL, причем в консольном приложении тот же код не вызывает у компилятора подозрений в утечке
К сожалению у меня сейчас времени нет посмотреть твой код -- на работе мелкий перезд, в результате два дня потеряны, и их надо отрабатывать Время появится только в выходные.
Если не работает код который в ДЛЛ, то распространенная проблема, это неправильные (не индентичные) ключи у компилятора/линкера для екзешника и для ДЛЛ. Если про эту проблему не знаешь, то можешь поискать на форуме --- подключение разных CRT часто встречается.
CVL>>ЗЫ Могу поделиться всеми своими фиксами, но только в понедельник. M>Было бы очень кстати здесь. Я немного изменил работу со строками, добавил поддержку const_string'ов и ввел новый инт, чтобы была возможность серелизовать в хексе. Исправил работу с enum и еще что-то по мелочи... Подробности не помню -- давно уже правил...
... << RSDN@Home 1.1.4 beta 7 rev. 458>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, Андрей Мартынов, Вы писали:
АМ>>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.
OE>а чего надо подкрутить, чтоб можно было с полями типа CString работать, типа так:
OE>
OE>struct Clr
OE>{
OE> CString str;
OE> struct LayoutDefault : public Layout<Clr>
OE> {
OE> LayoutDefault()
OE> { // тег поле значение по умолчанию
OE> Simple(_T("STRING" ), &Clr::str, "default string");
OE> }
OE> };
OE>};
OE>
Внимательно читаем статью к библиотеке, или читаем ошибку при смене типа переменной на CString и получаем:
в файле SerizlizerPrim.h в пространстве имен Rsdn::Serializer::Primitives добавляем шаблон для нужного типа.
Но по-моему тех, что реализованы в библиотеке достаточно. Для строк можно использовать tstring (это typedef на std::wstring), который оперирует 2х байтовыми символами. В значении по умолчанию пишем что-то вроде этого:
std::wstring(L"Microsoft")
С уважением, cpp_best.
P.S. Сам мучился с этим, и как всегда сработала извечная истина: находишь решение в ... (блин, уже спать пора)
Re: как сериализовать контейнер контейнеров контейнеров.