Сериализация объектов C ++

Я хотел бы реализовать класс сериализации, который принимает объект, преобразует его в двоичный поток и хранит в файле. Позже объект следует реконструировать из файла.

Хотя эта функциональность обеспечивается BinaryFormatter на C #, я хотел бы создать свой собственный класс сериализации с нуля.

Может кто-нибудь указать на какие-то ресурсы?

заранее спасибо


person KodeWarrior    schedule 19.09.2012    source источник
comment
Вы хотите поддерживать такие вещи, как управление версиями?   -  person Vaughn Cato    schedule 19.09.2012
comment
Вы не можете. В C ++ нет интроспекции (также известной как отражение). Эта возможность позволяет создавать универсальные объекты сериализатора. Без него вам нужно добавить код сериализации к каждому классу, который вы хотите сериализовать.   -  person n. 1.8e9-where's-my-share m.    schedule 19.09.2012
comment
Вы можете обратиться к библиотеке ускоренной сериализации за примером расширенной системы сериализации для C ++.   -  person Vaughn Cato    schedule 19.09.2012
comment
Не очень двоичный, но есть большая дискуссия: stackoverflow.com/questions/1809670/ По сути, прямого пути не существует. Либо вы используете магию шаблонов и сами пишете макет класса, а компилятор C ++ запускает ваши шаблоны для сохранения / загрузки, либо вы используете генератор кода, который записывает код сохранения / загрузки для каждого из ваших классов.   -  person Viktor Latypov    schedule 19.09.2012
comment
C #, созданный на основе dotnet, имеет отличные возможности для отражения и аннотаций кода, что значительно упрощает все виды задач (де) сериализации. Попытка сделать это обобщенным способом в C ++ будет кошмарно сложной.   -  person Rook    schedule 19.09.2012
comment
@KodeWarrior Возможно, вам стоит взглянуть на s11n-библиотеку Стефана Била.   -  person πάντα ῥεῖ    schedule 19.09.2012


Ответы (4)


Я уже давно использую библиотеку boost :: serialization и считаю ее очень хорошей. Вам просто нужно создать такой код сериализации:

class X {
  private:
    std::string value_;
  public:
    template void serialize(Archive &ar, const unsigned int version) {
       ar & value_;
     };
 }

Не нужно создавать код десериализации (поэтому использовали оператор &). Но при желании вы все равно можете использовать операторы ‹★ и >>.

Также можно написать метод сериализации для класса без изменений (например: если вам нужно сериализовать объект, поступающий из библиотеки). В этом случае следует сделать что-то вроде:

namespace boost { namespace serialization {
       template
       void serialize(Archive &ar, X &x const unsigned int version) {
                    ar & x.getValue();
       };
    }}
person Filipe    schedule 19.09.2012
comment
template без параметров? Это законно? - person user253751; 25.12.2014

Я хочу дать вам отрицательный ответ. Это менее полезно, но все же может быть.

Я использую ускоренную сериализацию несколько лет, и это была одна из величайших стратегических ошибок моей компании. Он производит очень большой вывод, он очень медленный, он распространяет целую кучу зависимостей, что делает все невозможным для компиляции, и затем из него трудно выйти, потому что у вас есть существующие сериализованные форматы. Кроме того, он ведет себя по-разному в разных компиляторах, поэтому обновление VS2005 до 2010 фактически заставило нас написать уровень совместимости, что также сложно, потому что код очень трудно понять.

person Pavel Radzivilovsky    schedule 19.09.2012

Вот 2 решения для сериализации C ++:

Лично у меня есть опыт работы только с 1-м и на самом деле я использовал только сериализаторы на основе текста, но я знаю, что легко определить двоичные сериализаторы для использования с s11n.

person πάντα ῥεῖ    schedule 19.09.2012

Может быть интересен C ++ Middleware Writer. Он имеет преимущества в производительности по сравнению с библиотекой сериализации в Boost. Он также автоматизирует создание функций сериализации.

person isaac    schedule 19.09.2012