Предложение по методам сериализации объектов C ++ - PullRequest
2 голосов
/ 02 января 2012

Я создаю библиотеку сериализации объектов C ++. Это больше относится к самообучению и улучшениям, и я не хочу использовать готовую библиотеку, такую ​​как boost или google protocol buf. Пожалуйста, поделитесь своим опытом или комментариями о хороших способах решения этой проблемы (например, создание некоторой кодировки с использованием значения тега и т. Д.). Я хотел бы начать с поддержки POD с последующей поддержкой нелинейных DS.

Спасибо PS: HNY2012

Ответы [ 3 ]

1 голос
/ 02 января 2012

Если вам нужна сериализация для межпроцессного взаимодействия, то я предлагаю использовать некоторый язык интерфейса ( IDL или ASN.1 ) для определения интерфейсов.

Так что будет проще поддерживать и другие языки (кроме C ++).А также будет проще реализовать генератор кода / заглушки.

1 голос
/ 02 января 2012

Я работаю над чем-то похожим последние несколько месяцев. Я не мог использовать Boost, потому что задача состояла в том, чтобы сериализовать группу существующих классов (огромную существующую кодовую базу), и было неуместно иметь классы, наследуемые от интерфейса, который имел виртуальную функцию serialize () (мы не хотели множественного наследования) .

Используемый подход имел следующие существенные особенности:

  1. Создайте вспомогательный класс для каждого существующего класса, назначенный задачей сериализации этого конкретного класса, и сделайте вспомогательный класс другом сериализуемого класса. Это позволяет избежать введения наследования в сериализуемый класс, а также предоставляет вспомогательному классу доступ к закрытым переменным.
  2. Пусть каждый из вспомогательных классов (назовем их «сериализаторами») зарегистрирует себя в глобальной карте. Каждый класс сериализатора реализует виртуальную функцию clone () (шаблон 'prototype'), которая позволяет извлекать указатель на сериализатор по имени класса из этой карты. Имя получено с использованием информации RTTI для конкретного компилятора. Регистрация в глобальной карте осуществляется путем создания экземпляров статических указателей и их «нового», поскольку статические переменные создаются до запуска программы.
  3. Был создан специальный объект потока (полученный из std::fstream), который содержал шаблонные функции для сериализации не указателей, указателей и типов данных STL. Потоковый объект может быть открыт только в режимах только для чтения или только для записи (по замыслу), поэтому одну и ту же функцию serialize () можно использовать для чтения из файла или записи в файл, в зависимости от режима, в котором поток был открыт. Таким образом, нет вероятности какого-либо несоответствия в порядке чтения и записи членов класса.
  4. Для каждого объекта, который был сохранен или восстановлен, был создан уникальный тег (целое число) на основе адреса переменной и сохранен на карте. Если тот же адрес возник снова, был сохранен только тег, а не сам глубоко скопированный объект. Таким образом, каждый объект был глубоко скопирован в файл только один раз.

На странице в Интернете представлены некоторые из этих идей, которыми вы поделились выше: http://www.cs.sjsu.edu/~pearce/modules/lectures/cpp/Serialization.htm. Надеюсь, что это поможет.

0 голосов
/ 02 января 2012

Я написал статью несколько лет назад. Код и инструменты могут быть устаревшими, но концепции могут оставаться прежними.

Может быть , это может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...