Pull to refresh

Comments 13

Теперь заработало. Я уж переживать начал.
Удобная сериализация данных с Variadic Templates
А я не понял, в чем, собственно, удобство? Чем это решение лучше, чем просто операторы << и >> с каким-нибудь специальным классом, представляющим поток сериализованных данных?

При таком подходе не нужно наследование и не нужен метод SerializedSize. Способ представления сериализованных данных зависит от класса потока, соответственно, не только легко можно подменить одну реализацию другой, но и иметь несколько различных реализаций потоков одновременно. А кроме того, это будет работать без variadic template-ов, а разница в использовании сведется к замене "," в вызове функции на << или >>.
Возможно ваш подход и лучше. Я редко использую потоки, не подумал о них. Я не считаю что мое решение самое удобное. Скажем так: удобнее с ним чем без него. SerializedSize нужен если в списке аргументов есть экземпляр класса, производный от самого AbstractSaveData. Таких вложений может быть сколь угодно, я посчитал эту возможность полезной.
По сути наследование здесь тоже не нужно для сериализации, оно нужно опять же для возможности создания иерархии данных.
Насколько я понял из прочитанного по вашей ссылке, там используется внешний генератор исходного кода, так что наверняка лучше, ведь возможностей для анализа данных там больше. Но с другой стороны чтобы мой код работал достаточно только компилятора c++
Кстати, помимо других похожих либ вроде Thrift или Cap'n Proto, свой достаточно интересный аналог есть и у Microsoft, к тому же написанный на Haskell :) — Microsoft Bond.
Основная проблема любых сериализаций (и рефлексии на С++ как таковой) это необходимость описывать поля еще раз, отдельно от самой структуры данных. Решения со встроенным описанием (на boost.preprocessor) слишком громоздки и не все хотят с ними связываться.
Но если уж описывать отдельно — то хотя-бы один раз. У вас описано три раза (в Serialization, Deserialization и CalculateSize). Есть интересные решения на шаблонах, когда данные описываются один раз, а дополнительным агрументом передается некий объект-обработчик, который делает то что нужно: сериализует и десериализует (причем разные обработчики могут писать/читать в любые форматы — binary, xml, json...), загружает в GUI для унифицированного отображения и т.д.
Чтобы не описывать данные три раза, я в конце предложил использовать кортеж. Можно один раз в нем описать данные и передавать его как аргумент.
А как в вашем случае поддерживать версирование?
Sign up to leave a comment.

Articles