повысить сериализацию и удваивается - PullRequest
8 голосов
/ 02 июня 2011

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

Ниже приведен код, который я использую для сериализации:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/string.hpp>

std::stringstream ss;
boost::archive::text_oarchive oa(ss);
oa << mPoint;

Вот метод сериализации в моем классе Point:

friend class boost::serialization::access;

template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
    if (version > 0)
    {
        ar & mLatitude;
        ar & mLongitude;
    }
}

Когда я сериализую в строку, не похоже, что Boost обрабатывает двойное преобразование в строку, как я ожидал (там появляютсябыть вопросы округления).Изучая немного, похоже, что другие сообщили о том же поведении.Я также понимаю проблемы, связанные с точностью, связанные с преобразованием двойного в строку и наоборот, и как это может вызвать проблему.

Что странно, и я не понимаю, хотя, кажется, этого не происходит, когда я использую сам поток строки и перенаправляю double на поток, или когда я использую функцию boost lexical_cast для преобразования изstringstream.str () возвращается к двойному.Прежде чем обнаружить, что boost имеет свои собственные классы сериализации / десериализации, я фактически написал свой собственный, используя вызовы stringstream и lexical_cast, и он работал без проблем.Я действительно надеюсь, что мне не придется отказываться от библиотеки сериализации и вернуться к тому, что у меня было раньше.Надеюсь, есть только некоторые настройки / черты / и т.д.Я скучаю.

Ответы [ 2 ]

2 голосов
/ 05 июня 2011

Вы можете попытаться заставить свой поток использовать научный формат для чисел с плавающей запятой перед сериализацией к нему:

ss << std::scientific;

Похоже, что библиотека Boost правильно устанавливает точность, но, похоже, не устанавливает формат. В качестве альтернативы вы можете, я думаю, получить и переопределить логику для сохранения и / или загрузки чисел с плавающей запятой, не выбрасывая остальную часть библиотеки - начинайте здесь .

Похоже, что ведется работа по поддержке бесконечностей и т. Д.

0 голосов
/ 04 июня 2011

Это не дает прямого ответа на вопрос Boost.Serialization, но является возможным обходным путем.

Из приведенного выше вопроса мне не ясно, нужно ли вам строковое представление или нет.Если вы ищете кроссплатформенное представление (двоичное или иное), рассмотрите возможность использования protobuf, который поддерживает кодирование double s.

http://code.google.com/apis/protocolbuffers/docs/proto.html#scalar

...