Здравствуйте, eao197, Вы писали:
E>Здравствуйте, <Аноним>, Вы писали:
E>>>Разнообразие я люблю, даже сам таким разно(безо)бразием занимаюсь. Но вот про "легче" можно говорить, при условии, что он (твой подход) обладает еще какими-то интересными качествами. А вот "внешне другой" -- это не аргумент.
А>>Скажем так — я постарался сделать это настолько простым насколько это было возможно.
E>А мне казалось, что нужно делать максимально функциональным и удобным.
А>>Сериализация в стиле минимализма — она никогда не станет второй ObjESSty
E>Вот и славненько. Можно вздохнуть свободно
E>
E>>>Мне не понравилось, что стандартные контейнеры нужно заменять твоими аналогами.
А>>Добавьте макрос SERIALIZE_STL_CONTAINER, если вас смущают мои контейнеры.(единственное — Вам нужно будет для контейнера уметь в компилтайм определить — специализирован он POD типом или наследованным от CSerializableBase).
E>Вот этого не понял. Мне что-то нужно? Мне нужно указать, что контейнер должен быть сериализован. А все остальное должна определять система сериализации.
Вам нужно написать две функции:
template<class ContainerType>
int SerializeStlContainer(const ContainerType& refContainer, CSerializedUpContainer* pObjectToSerialize);
template<class ContainerType>
int UnSerializeStlContainer(ContainerType& refContainer, CSerializedUpContainer* pObjectToSerialize);
и залепить эти функции в новый макрос SERIALIZE_STL_CONTAINER(). Каждая функция будет занимать 6-7 строк (в одном случае перебрать контейнер в цикле, в другом заполнить его).
Но имейте в виду, что код, который будет работать для листа и вектора, скорее всего не будет работать для map — т.к. вставка в них происходит совершенно разыми способами.
E>>>Из статьи я не понял, поддерживается ли (и как) наследование не напрямую от CSerializableBase, а от другого сериализуемого класса, уже унаследованного от CSerializableBase.
А>>Поддерживается. Так как вам это нужно — главное что б открытые члены CSerializableBase были доступны из класса в котором определена карта.
E>Было бы хорошо, если бы это в статье было показано.
E>Кстати, а полиморфные атрибуты можно сериализовать? Скажем есть A, производный от CSerializableBase. И есть B, атрибутом которого является A*. И этот указатель может указывать на любой производный от A сериализуемый класс.
Абсалютна адназначна ДА!
CSerializableBase наследован от интерфейса ISerialize. Именно этот интерфейс ждёт SERIALIZE_T() (точнее не он а пара функций которые за ним стоят). Объект может быть на самом деле чем угодно — но он ДОЛЖЕН реализовывать этот интерфейс, если хочет учавствовать в карте сериализации.