Comments 13
Почему то большую часть статьи не видно…
Удобная сериализация данных с Variadic TemplatesА я не понял, в чем, собственно, удобство? Чем это решение лучше, чем просто операторы << и >> с каким-нибудь специальным классом, представляющим поток сериализованных данных?
При таком подходе не нужно наследование и не нужен метод SerializedSize. Способ представления сериализованных данных зависит от класса потока, соответственно, не только легко можно подменить одну реализацию другой, но и иметь несколько различных реализаций потоков одновременно. А кроме того, это будет работать без variadic template-ов, а разница в использовании сведется к замене "," в вызове функции на << или >>.
Возможно ваш подход и лучше. Я редко использую потоки, не подумал о них. Я не считаю что мое решение самое удобное. Скажем так: удобнее с ним чем без него. SerializedSize нужен если в списке аргументов есть экземпляр класса, производный от самого AbstractSaveData. Таких вложений может быть сколь угодно, я посчитал эту возможность полезной.
Чем это лучше Google Protocol Buffers, который, к тому же, еще и «language-neutral, platform-neutral extensible mechanism for serializing structured data.»?
Насколько я понял из прочитанного по вашей ссылке, там используется внешний генератор исходного кода, так что наверняка лучше, ведь возможностей для анализа данных там больше. Но с другой стороны чтобы мой код работал достаточно только компилятора c++
Кстати, помимо других похожих либ вроде Thrift или Cap'n Proto, свой достаточно интересный аналог есть и у Microsoft, к тому же написанный на Haskell :) — Microsoft Bond.
Основная проблема любых сериализаций (и рефлексии на С++ как таковой) это необходимость описывать поля еще раз, отдельно от самой структуры данных. Решения со встроенным описанием (на boost.preprocessor) слишком громоздки и не все хотят с ними связываться.
Но если уж описывать отдельно — то хотя-бы один раз. У вас описано три раза (в Serialization, Deserialization и CalculateSize). Есть интересные решения на шаблонах, когда данные описываются один раз, а дополнительным агрументом передается некий объект-обработчик, который делает то что нужно: сериализует и десериализует (причем разные обработчики могут писать/читать в любые форматы — binary, xml, json...), загружает в GUI для унифицированного отображения и т.д.
Но если уж описывать отдельно — то хотя-бы один раз. У вас описано три раза (в Serialization, Deserialization и CalculateSize). Есть интересные решения на шаблонах, когда данные описываются один раз, а дополнительным агрументом передается некий объект-обработчик, который делает то что нужно: сериализует и десериализует (причем разные обработчики могут писать/читать в любые форматы — binary, xml, json...), загружает в GUI для унифицированного отображения и т.д.
Автору стоит взглянуть вот на это msgpack.org
А как в вашем случае поддерживать версирование?
Sign up to leave a comment.
Удобная сериализация данных с Variadic Templates