boost::serialization + enum class
От: real_sba http://cellwar.xyz/
Дата: 01.09.14 14:07
Оценка:
Добрый день, уважаемые коллеги!
#include <boost/archive/binary_oarchive.hpp>
#include <map>

int main(int argc, char** argv)
{
  enum class Type : uint8_t {
    A = 1,
    B = 2,
    C = 3,
  };

  std::map<Type, uint16_t> t1;
  t1.insert(std::make_pair(Type::A, 42));
  t1.insert(std::make_pair(Type::B, 42));
  t1.insert(std::make_pair(Type::C, 42));

  std::map<uint8_t, uint16_t> t2;
  t2.insert(std::make_pair(1, 43));
  t2.insert(std::make_pair(2, 43));
  t2.insert(std::make_pair(3, 43));

  {
    std::stringstream os;
    boost::archive::binary_oarchive oa(os);
    oa << t1;
    std::cout << os.str().length() << std::endl;
  }

  {
    std::stringstream os;
    boost::archive::binary_oarchive oa(os);
    oa << t2;
    std::cout << os.str().length() << std::endl;
  }

  return 0;
}
Вывод:
80
71
На сколько я понимаю, для контейнера t1 длина ключа 32 бита, вместо ожидаемых 8-ми. Почему так происходит и как добиться чтобы на битовом уровне длина ключа соответствовала используемому типу? Ведь sizeof(Type) == 1.
Re: boost::serialization + enum class
От: uzhas Ниоткуда  
Дата: 01.09.14 14:25
Оценка: 2 (1) +1 -2
Здравствуйте, real_sba, Вы писали:

_>На сколько я понимаю, для контейнера t1 длина ключа 32 бита, вместо ожидаемых 8-ми. Почему так происходит и как добиться чтобы на битовом уровне длина ключа соответствовала используемому типу? Ведь sizeof(Type) == 1.


http://bit.ly/1ulUzcd
Re: boost::serialization + enum class
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.09.14 15:02
Оценка: 35 (1)
_>... как добиться чтобы на битовом уровне длина ключа соответствовала используемому типу? Ведь sizeof(Type) == 1.

использовать YAS?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: boost::serialization + enum class
От: Кодт Россия  
Дата: 01.09.14 15:48
Оценка: +1 -1
Здравствуйте, uzhas, Вы писали:

U>http://bit.ly/1ulUzcd


Минус за LMGTFY, три раза.
Во-первых, ссылкосжиматель хорош для твиттера от безысходности, а для интернетов можно и прямую давать.
Во-вторых, грубо!
В-третьих, на поставленный вопрос так и не ответил.

Первые несколько ссылок идут на обычные энумы, у которых underlying type не меньше, чем int. Для них, конечно, надо сделать хак — обёртку с явно перегруженными функциями сериализации через подходящий тип.

Энум-классы же вполне могли бы сериализоваться в правильном типе, но, видимо, буст в этом месте достаточно старый и не поддержал стандарт в полной мере. Как бы, работает — и ладно.
Перекуём баги на фичи!
Re[3]: boost::serialization + enum class
От: uzhas Ниоткуда  
Дата: 01.09.14 16:12
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Во-первых, ссылкосжиматель хорош для твиттера от безысходности, а для интернетов можно и прямую давать.

К>Во-вторых, грубо!
согласен, прошу прощения, если обидел ТС или еще кого-то. это скорее из вредности случилось не было очевидно, что ТС прошел по этим ссылкам, чтобы иметь первичное представление о проблеме и способах решения

К>В-третьих, на поставленный вопрос так и не ответил.

тут я не согласен, первая же ссылка содержит помощь. думаю, твое "в-третьих" родилось из первых двух

К>Первые несколько ссылок идут на обычные энумы, у которых underlying type не меньше, чем int. Для них, конечно, надо сделать хак

первая ссылка содержит рекомендацию сделать хак и ничего не советует из буста, что намекает о том, что такова селяви буст
пятая ссылка ведет в бустовый мейл-лист и тоже содержит лишь хак
Re[4]: boost::serialization + enum class
От: Кодт Россия  
Дата: 01.09.14 16:27
Оценка:
Здравствуйте, uzhas, Вы писали:

К>>Первые несколько ссылок идут на обычные энумы, у которых underlying type не меньше, чем int. Для них, конечно, надо сделать хак


U>первая ссылка содержит рекомендацию сделать хак и ничего не советует из буста, что намекает о том, что такова селяви буст

U>пятая ссылка ведет в бустовый мейл-лист и тоже содержит лишь хак

Ты имеешь в виду их багтрекер — https://svn.boost.org/trac/boost/ticket/9843 ?
Сложилось впечатление, что ответственный за буст.архив просто решил забить болт на "эту новомодную экзотику".
Открыл, закрыл "инвалид", переоткрыл, перезакрыл "инвалид".
Перекуём баги на фичи!
Re[5]: boost::serialization + enum class
От: uzhas Ниоткуда  
Дата: 01.09.14 16:31
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ты имеешь в виду их багтрекер — https://svn.boost.org/trac/boost/ticket/9843 ?


эту имел в виду http://marc.info/?l=boost-users&amp;m=131805528829364 (плохо считаю )
Re[3]: boost::serialization + enum class
От: Ops Россия  
Дата: 01.09.14 18:47
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Во-первых, ссылкосжиматель хорош для твиттера от безысходности, а для интернетов можно и прямую давать.

LMGTFY вроде по-умолчанию сжатую выдает.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: boost::serialization + enum class
От: Кодт Россия  
Дата: 01.09.14 19:56
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>LMGTFY вроде по-умолчанию сжатую выдает.


http://lmgtfy.com?q=lmgtfy
Перекуём баги на фичи!
Re[5]: boost::serialization + enum class
От: Ops Россия  
Дата: 01.09.14 20:44
Оценка:
Здравствуйте, Кодт, Вы писали:

Ops>>LMGTFY вроде по-умолчанию сжатую выдает.


К>http://lmgtfy.com?q=lmgtfy


Давно не пользовался.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: boost::serialization + enum class
От: real_sba http://cellwar.xyz/
Дата: 13.09.14 08:06
Оценка:
Здравствуйте, niXman, Вы писали:

X>использовать YAS?

Ознакомился. Скорость радует.
Не понял как предлагается решать задачу версионности структур данных?
Re[3]: boost::serialization + enum class
От: niXman Ниоткуда https://github.com/niXman
Дата: 13.09.14 11:36
Оценка:
Здравствуйте, real_sba, Вы писали:

_>Не понял как предлагается решать задачу версионности структур данных?

предполагается, что это решается на уровня пользователя.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: boost::serialization + enum class
От: real_sba http://cellwar.xyz/
Дата: 13.09.14 12:27
Оценка:
Здравствуйте, niXman, Вы писали:

_>>Не понял как предлагается решать задачу версионности структур данных?

X>предполагается, что это решается на уровня пользователя.
Пока никак не соображу как это сделать эффективно.
Вносить дополнительную информацию (о версии структуры данных) в протокол вручную? (ИМХО не вариант)
Отредактировано 13.09.2014 12:28 real_sba . Предыдущая версия .
Re[5]: boost::serialization + enum class
От: niXman Ниоткуда https://github.com/niXman
Дата: 13.09.14 12:52
Оценка: 2 (1)
Здравствуйте, real_sba, Вы писали:

_>Вносить дополнительную информацию (о версии структуры данных) в протокол вручную? (ИМХО не вариант)

у нас, клиент, при подключении, первым делом сообщает серверу поддерживаемую версию протокола. и все, дальше сервер переключается на нужную версию.
никакого отдельного поля для каждой структуры.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: boost::serialization + enum class
От: niXman Ниоткуда https://github.com/niXman
Дата: 13.09.14 13:02
Оценка: +1
вообще, мы от этого пытаемся избавиться, путем принудительного автоапдейта клиента, по двум причинам:
1. держать несколько ветвей кода для версий API+данных — неразумно.
2. у нас никогда так и не было более одной версии данных. API+данных устаканиваются до релиза проекта.

но все зависит от задачи. в геймдеве, в наших проектах, нам так проще.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 13.09.2014 13:03 niXman . Предыдущая версия .
Re[7]: boost::serialization + enum class
От: niXman Ниоткуда https://github.com/niXman
Дата: 13.09.14 13:03
Оценка:
Здравствуйте, niXman, Вы писали:

X>вообще, мы от этого пытаемся избавиться, путем принудительного автоапдейта клиента, по двум причинам:

X>1. держать несколько ветвей кода для разных версий API+данных — неразумно.
X>2. у нас никогда так и не было более одной версии данных. API+данные устаканиваются до релиза проекта.

X>но все зависит от задачи. в геймдеве, в наших проектах, нам так проще.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: boost::serialization + enum class
От: niXman Ниоткуда https://github.com/niXman
Дата: 13.09.14 13:04
Оценка:
что-то редактирование бажит %)


вот так:
вообще, мы от этого пытаемся избавиться, путем принудительного автоапдейта клиента, по двум причинам:
1. держать несколько ветвей кода для разных версий API+данных — неразумно.
2. у нас никогда так и не было более одной версии API+данных. API+данные устаканиваются до релиза проекта.

но все зависит от задачи. в геймдеве, в наших проектах, нам так проще.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 13.09.2014 13:06 niXman . Предыдущая версия .
Re[6]: boost::serialization + enum class
От: real_sba http://cellwar.xyz/
Дата: 13.09.14 13:17
Оценка:
Здравствуйте, niXman, Вы писали:

X>у нас, клиент, при подключении, первым делом сообщает серверу поддерживаемую версию протокола. и все, дальше сервер переключается на нужную версию.

X>никакого отдельного поля для каждой структуры.
С точки зрения сетевого взаимодействия, когда необходимо одновременно поддерживать разные версии протокола — самое оно.
У меня же много проще случай. Данные сериализируются только для хранения (извне). Используется ленивое обновление на более новую версию (при первом сохранении объекта). Данные во внешнем хранилище могут сколько угодно долго находиться в одном из старых форматов, пока случайно лениво не обновятся, либо пока не приспичит и будет принудительно запущена процедура перехода на последнюю версию (после этого на сервере убирается поддержка более старых форматов). Суть — один в один согласно идеологии boost::serialization.
Re[7]: boost::serialization + enum class
От: niXman Ниоткуда https://github.com/niXman
Дата: 13.09.14 14:20
Оценка:
ну...если хранимые типы данных между собой не связаны, и их большое кол-во — то для каждого типа/стркутуры можно сохранять версию отдельным полем, и, агрегировать сериализатор/десериализатор.

нужно больше информации, чтоб понять проблему...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.