сериализация boost::posix_time::ptime
От: RikkiTikkiTavi Россия  
Дата: 28.01.13 14:31
Оценка:
Всем привет!

В качестве класса для описания времени я выбрал boost::posix_time::ptime (дабы продолжить приобщаться к boost).

Теперь мне нужно сериализовать его в файл, причем своим сериализатором.
Как это сделать?

Самое простое, видимо, было бы получить внутренее представление ( в виде int64, если я правиль понял ) и сериализовать по его типу. Но не смог найти метод доступа...

Либо, писать какой-то свой сериализатор? как?

Заранее спасибо за помощь!
Re: сериализация boost::posix_time::ptime
От: zaufi Земля  
Дата: 28.01.13 14:38
Оценка:
Здравствуйте, RikkiTikkiTavi, Вы писали:

RTT>Всем привет!


RTT>В качестве класса для описания времени я выбрал boost::posix_time::ptime (дабы продолжить приобщаться к boost).


RTT>Самое простое, видимо, было бы получить внутренее представление ( в виде int64, если я правиль понял ) и сериализовать по его типу. Но не смог найти метод доступа...


почему-то там int32 к сожалению...

RTT>Теперь мне нужно сериализовать его в файл, [bпричем своим сериализатором.[/b]

RTT>Как это сделать?
RTT>Либо, писать какой-то свой сериализатор? как?
что-то я недопонимаю -- у тебя же своя сериализация... вот и делай сам

я делал так:
namespace details {
/// \todo Why \c sec_type is a 32bit size?
struct ptime_saver
{
  template <typename Buffer>
  static void invoke(Buffer& ob, const boost::posix_time::ptime& t)
  {
    const boost::posix_time::time_duration::sec_type stamp = (t - TIME_T_EPOCH).total_seconds();
    ob << stamp;
  }
};
/// \todo Why \c sec_type is a 32bit size?
struct ptime_loader
{
  template <typename Buffer>
  static void invoke(Buffer& ib, boost::posix_time::ptime& t)
  {
    boost::posix_time::time_duration::sec_type stamp;
    ib >> stamp;
    t = boost::posix_time::from_time_t(stamp);
  }
};

}                                                           // namespace details

/**
 * \brief Serialize overload to deal w/ \c boost::posix_time::ptime
 */
template <typename Buffer>
void serialize(Buffer& b, boost::posix_time::ptime& t, const int)
{
  boost::mpl::eval_if<
      typename Buffer::is_load
    , boost::mpl::identity<details::ptime_loader>
    , boost::mpl::identity<details::ptime_saver>
    >::type::template invoke(b, t);
}
Re: сериализация boost::posix_time::ptime
От: jazzer Россия Skype: enerjazzer
Дата: 29.01.13 08:16
Оценка:
Здравствуйте, RikkiTikkiTavi, Вы писали:

RTT>Всем привет!


RTT>В качестве класса для описания времени я выбрал boost::posix_time::ptime (дабы продолжить приобщаться к boost).


Насколько я знаю, его собираются deprecate-нуть в пользу std::chrono
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: сериализация boost::posix_time::ptime
От: Ops Россия  
Дата: 29.01.13 08:48
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Насколько я знаю, его собираются deprecate-нуть в пользу std::chrono


Каким образом? В пользу boost::chrono я еще допускаю (но там не все еще ясно, даже ввода-вывода 2 версии), а в std::chrono очень многого не хватает.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: сериализация boost::posix_time::ptime
От: niXman Ниоткуда https://github.com/niXman
Дата: 29.01.13 12:10
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Насколько я знаю, его собираются deprecate-нуть в пользу std::chrono

угу, на компиляторах поддерживающих C++11. иначе boost.chrono.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: сериализация boost::posix_time::ptime
От: jazzer Россия Skype: enerjazzer
Дата: 29.01.13 12:36
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, jazzer, Вы писали:


J>>Насколько я знаю, его собираются deprecate-нуть в пользу std::chrono


Ops>Каким образом? В пользу boost::chrono я еще допускаю (но там не все еще ясно, даже ввода-вывода 2 версии), а в std::chrono очень многого не хватает.


http://article.gmane.org/gmane.comp.lib.boost.devel/235048/match=posix_time
так что от него постепенно избавляются.

Но ты прав, boost.chrono лучше, и по той причине, что ты упомянул, и по той, что C++11 пока что далеко не во всех проектах есть.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: сериализация boost::posix_time::ptime
От: nen777w  
Дата: 29.01.13 15:40
Оценка:
RTT>Либо, писать какой-то свой сериализатор? как?
RTT>Заранее спасибо за помощь!

Гм... Ну как бы... Не?
#include "boost/date_time/posix_time/time_serialize.hpp"
Re[2]: сериализация boost::posix_time::ptime
От: RikkiTikkiTavi Россия  
Дата: 01.02.13 13:39
Оценка:
Здравствуйте, nen777w, Вы писали:
N>Гм... Ну как бы... Не?
N>#include "boost/date_time/posix_time/time_serialize.hpp"

Не. Там сериализация с помощью бустовской библиотеки.

А мне нужно сохранить в бинарный файл.
Грубо говоря
fopen
file << ptime
fclose

Простейшим, видимо, будет сконвертировать значение к целому типу достаточно вместительного размера и сохранять его
Re[3]: сериализация boost::posix_time::ptime
От: nen777w  
Дата: 01.02.13 23:41
Оценка:
N>>Гм... Ну как бы... Не?
N>>#include "boost/date_time/posix_time/time_serialize.hpp"

RTT>Не. Там сериализация с помощью бустовской библиотеки.

RTT>А мне нужно сохранить в бинарный файл.

RTT>Простейшим, видимо, будет сконвертировать значение к целому типу достаточно вместительного размера и сохранять его


А я понял, сори невнимательно прочитал.
Ну так можно посмотреть по коду что бустоводы сделали для этого. Из того что я вижу это какие то синонимы типов
posix_time::time_duration::hour_type, posix_time::time_duration::min_type и т.д. вероятно являющимися что то вроде int, long (лень копаться сейчас)
Которые и сериализуют.
Также в некотором случае когда стоит флаг is_special время сериализуют как строку to_simple_string(td);
Ну вот как то так...

з.ы.
Интересно стало что за is_special такой, пойду наверно покопаюсь...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.