// создаем новый объект нужного класса
ASSERT(pNewObject->IsKindOf(RUNTIME_CLASS(CMyObject));
// проверяем класс объекта
Меня удивило, что большинство из вас подписывается именно на HTML – я думал, наши люди как никакие другие считают каждый килобайт. Но, видимо, времена меняются – в лучшую сторону. Дай бог! Так что по вышеописанным причинам я решил поднапрячься и сработать собственный HTML-вариант. То, что получилось, сейчас перед вами, уважаемые HTML-подписчики. Тех, кто выписывает текстовый вариант, уговаривать подписаться на HTML я не буду, потому что прекрасно их понимаю ;) Оба варианта я буду делать лично, никакой автоматической генерации. Enjoy.
Мне пришло интересное письмо на тему предыдущего выпуска. Хочу предложить его вашему вниманию:
Приветствую!
Я только что обнаружил эту рассылку, подписался и 2 первых выпуска прочитал в архиве. Очень надеюсь, что смогу оказать посильную помощь автору и читателям рассылки, так как около 30 лет занимаюсь программированием и последние 3-4 года – Visual C++. На работе сейчас я программирую именно на этом [языке – AJ], Visual Studio 6.0
В отношении вопроса Броника. Конечно, система сериализации для ActiveX имеется. Для этого рекомендуется использовать класс COLEControl (порожденный из CWnd –>CCMDTarget->CObject).
Вот пример из MSDN (у меня есть этот хелп и на работе и дома)
void CMyCtrl::Serialize(CArchive& ar) {
DWORD dwVersion = SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
SerializeExtent(ar);
SerializeStockProps(ar);
if (ar.IsLoading) {
// загрузить свойства
} else {
// сохранить свойства
}
}
Пару замечаний относительно сериализации. Вот пример, как можно поддерживать версию при сериализации. Это важная вещь, поскольку в классы регулярно заносятся новые данные, и чтение-сериализация должны поддерживать старые версии распространенных среди пользователей Вашей программы файлов.
IMPLEMENT_SERIAL(CMyClass, CObject, VERSIONABLE_SCHEMA | 2)
// 2- Номер текущей (новой) версии. 1 - номер старой версии
void CMyClass::Serialize(CArchive& ar) {
if (ar.IsLoading) {
UINT Version;
ar.ReadClass(RUNTIME_CLASS(CMyClass), &Version);
switch(Version) {
case 2:
// чтение по-новому
break;
case 1:
// чтение по-старому
break;
}
}
if (ar.IsStoring) {
ar.WriteClass( RUNTIME_CLASS(CMyClass));
// запись по-новому
}
}
Понятное дело, при продвижении версии номер в IMPLEMENT_SERIAL возрастает, и добавляется новый случай case только при чтении соответствующих версий.
Еще одно важное замечание. При использовании механизма сериализации мы платим некоторую цену: не допускается никаких абстрактных классов – забудьте, что это существует!