‘орум программистов, компьютерный форум, киберфорум
Ќаши страницы
Boost C++
¬ойти
–егистраци€
¬осстановить пароль
 
–ейтинг 4.67/6: –ейтинг темы: голосов - 6, средн€€ оценка - 4.67
Suares
0 / 0 / 0
–егистраци€: 28.02.2013
—ообщений: 106
1

—ериализаци€ CString

17.02.2014, 16:52. ѕросмотров 1046. ќтветов 5
ћетки нет (¬се метки)

” мен€ есть структура Person:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct Person
{
    //BOOST_SERIALIZATION_SPLIT_MEMBER();
 
public:
    Person::Person(const WTL::CString& name = "", const WTL::CString& num = "", const WTL::CString& birthday = "", const WTL::CString& address = "")
        : _name(name), _phoneNumber(num), _birthday(birthday), _address(address)
    {
    }
 
    WTL::CString _name;
    WTL::CString _phoneNumber;
    WTL::CString _birthday;
    WTL::CString _address;
 
private:
    friend class boost::serialization::access;
 
    template<typename Archive>
    void serialize(Archive& ar, Person& p, const unsigned int version)
    {
        split_free(ar, p._name, version);
        split_free(ar, p._phoneNumber, version);
        split_free(ar, p._birthday, version);
        split_free(ar, p._address, version);
    }
};
Ќе могу разобратьс€ с функцией serialize дл€ CString. ¬от именно нужен CString.  ак она дожна быть реализована дл€ CString?
ƒалее в классе ContactList € хочу записать в файл и считать с него множество контактов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class ContactList
{
public:
    ContactList();
    ~ContactList();
 
    void LoadPerons();
    void SavePersons();
 
    void AddPerson(const Person& p);
    void DeletePerson(const int id);
 
    Person GetPerson(size_t id);
    size_t GetSize() const;
 
private:
    std::vector<Person> _list;
};
 
void ContactList::LoadPerons()
{
    std::ifstream file("ContactList.txt");
    boost::archive::text_iarchive ia(file);
 
    ia >> _list;
}
 
void ContactList::SavePersons()
{
    std::ofstream file("ContactList.txt");
    boost::archive::text_oarchive oa(file);
 
    oa << _list;
}
я хот€ бы что-то правильно делаю?
0
Similar
Ёксперт
41792 / 34177 / 6122
–егистраци€: 12.04.2006
—ообщений: 57,940
17.02.2014, 16:52
ќтветы с готовыми решени€ми:

ќшибка преобразовани€ wsmatch в CString
— использованием библиотеки boost написал функцию получени€ имени хоста по урл.  омпилируетс€...

—ериализаци€ map-a
ѕодскажите, как можно сериализовать map&lt;char*, int&gt;? ≈сть пример дл€ &lt;int,int&gt;, но тут не идет...

—ериализаци€ данных
¬сем, привет. »нтересует несколько вопросов по сериализации данных через boost: 1. ћожно ли...

—ериализаци€ списка указателей
ƒоброго времени суток! ¬озник вопрос с сериализацией списка указателей. »меетс€ класс, который...

—ериализаци€ указателей на примитивные типы
ѕрошу пользователей пакета Serialization подсказать, что требуетс€ добавить в код, чтобы можно было...

5
Avazart
Ёксперт —++
7791 / 5691 / 560
–егистраци€: 10.12.2010
—ообщений: 25,918
«аписей в блоге: 17
07.10.2014, 00:00 2
’отел создать свою тему, но увидел что есть похожа€ по этому подниму ...

÷итата —ообщение от Suares ѕосмотреть сообщение
¬от именно нужен CString.
ћой вопрос в конкретной формулировке звучит так как сериализовать UnicodeString- тип строки из VCL (C++Builder).
“акой же вопрос можно задать и дл€ QString из Qt или другого типа который предоставл€етс€ теми или иными библиотеками или фреймворками и в код которого мы не можем вмешивать по очевидным причинам.

≈динственное что € нашел http://www.boost.org/doc/libs/1_56_0...trusiveversion
C++
1
2
3
4
5
6
7
8
9
10
11
namespace boost
{
    namespace serialization
    {
         template<class Archive>
         void serialize(Archive &ar,UnicodeString us,const unsigned int version)
         {
             /* ar & us; */
         }
    }
}
Ќо не пон€тно каким магическим образом можно объединить чтение и запись (иначе бы была возможность перевести UnicodeString к примеру в std::wstring сериализаци€ которого имеетс€)
0
ForEveR
¬ астрале
Ёксперт —++
8002 / 4760 / 653
–егистраци€: 24.06.2010
—ообщений: 10,547
«авершенные тесты: 3
07.10.2014, 11:17 3
Avazart, Ќу. save/load никто не мешает реализовать свободными, необ€зателен общий serialize.
»ли же написать serialize, в котором вызвать
C++
1
boost::serialization::split_free
и отдельно save/load, как реализовано допустим в сериализации дл€ std::complex.

ƒобавлено через 5 минут
√рубо говор€.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace boost { namespace serialization {
 
template<typename Archive, typename T>
void serialize(Archive& ar, T& t, const unsigned int version)
{
    boost::serialization::split_free(ar, t, version);
}
 
template<typename Archive, typename T>
void save(Archive& ar, const T& t, const unsigned int)
{
   ar << t;
}
 
template<typename Archive, typename T>
void load(Archive& ar, T& t, const unsigned int)
{
   ar >> t;
}
 
}
 
}
+ возможно придетс€ переопределить некоторые traits.
0
Avazart
Ёксперт —++
7791 / 5691 / 560
–егистраци€: 10.12.2010
—ообщений: 25,918
«аписей в блоге: 17
07.10.2014, 15:35 4
÷итата —ообщение от ForEveR ѕосмотреть сообщение
+ возможно придетс€ переопределить некоторые traits.
Ќу со строками сложнее ситуаци€ нежели с комплесным типом, traits в чем, дл€ чего?

ƒобавлено через 7 минут
ѕока € нашел решение через http://www.boost.org/doc/libs/1_56_0.../wrappers.html

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
 
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/binary_object.hpp>
 
BOOST_SERIALIZATION_SPLIT_FREE(UnicodeString)
BOOST_SERIALIZATION_SPLIT_FREE(AnsiString)
namespace boost {
    namespace serialization {
 
        template<class Archive>
        void save(Archive & ar, const UnicodeString& us, const unsigned int version)
        {
            const int size= us.Length()*sizeof(us[0]); // wchar_t
            ar & size;
            ar & boost::serialization::make_binary_object( const_cast<void*>(us.data()),
                                                                                                         size);
        }
 
        template<class Archive>
        void load(Archive & ar, UnicodeString& us, const unsigned int version)
        {
            int size;
            ar & size;
            us.SetLength(size/sizeof(us[0])); 
 
            ar & boost::serialization::make_binary_object( const_cast<void*>(us.data()),
                                                                                                         size);
        }
 
        template<class Archive>
        void save(Archive & ar, const AnsiString& as, const unsigned int version)
        {
            const int size= as.Length()*sizeof(as[0]); //  сhar
            ar & size;
            ar & boost::serialization::make_binary_object( const_cast<void*>(as.data()),
                                                                                                         size);
        }
 
        template<class Archive>
        void load(Archive & ar, AnsiString& as, const unsigned int version)
        {
            int size;
            ar & size;
            as.SetLength(size/sizeof(as[0])); 
 
            ar & boost::serialization::make_binary_object( const_cast<void*>(as.data()),
                                                                                                         size);
        }
    }
}
–аботает, но не особо нравитс€, ибо если открыть файл видим набор символов, а не читабельный текст как хотелось бы ибо все таки используетс€ text_archive. Ќо стоит заметить что std::wstring то же как-то выгл€дит не как хотелось бы в отличии от std::string.
0
Dmitriy_M
1433 / 1313 / 131
–егистраци€: 20.03.2009
—ообщений: 4,688
«аписей в блоге: 11
07.10.2014, 22:18 5
— QString когда то давно делал Boost C++ - сериализаци€ boost, xml_woarchive, ошибка линковани€
Ќо в последнем варианте вроде бы стал паковать в utf8 в std::string и сериализовать std::string.

ƒобавлено через 3 часа 28 минут
¬от последний вариант с QString
 ликните здесь дл€ просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <QtCore/QDebug>
#include <QtCore/QString>
 
#include <vector>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/vector.hpp>
 
#include <fstream>
 
namespace boost
{
    namespace serialization
    {
 
        template<class Archive>
        inline void save(Archive& ar, const QString& s,
                const unsigned int /*version*/)
        {
            auto ba = s.toUtf8();
            std::string str(ba.data(), ba.size());
 
            ar << make_nvp("QString", str);
        }
 
        template<class Archive>
        inline void load(Archive& ar, QString& s,
                const unsigned int /*version*/)
        {
            std::string str;
            ar >> make_nvp("QString", str);
            QByteArray ba(&str[0], str.size());
            s.append(ba);
        }
 
        template<class Archive>
        inline void serialize(Archive& ar, QString& s,
                const unsigned int file_version)
        {
            boost::serialization::split_free(ar, s, file_version);
        }
 
    } // namespace serialization
} // namespace boost
 
int main(int argc, char** argv)
{
    {
        std::ofstream ofs("test.xml");
        boost::archive::xml_oarchive oa(ofs);
        std::vector<QString> s =
        { "≈хал грека", "еєі1жЬИжЩѓжШ*ж*°" };
        oa << BOOST_SERIALIZATION_NVP(s);
        ofs.flush();
    }
 
    {
        std::ifstream ifs("test.xml");
        boost::archive::xml_iarchive ia(ifs);
        std::vector<QString> s;
        // restore the schedule from the archive
        ia >> BOOST_SERIALIZATION_NVP(s);
        for (auto str: s)
        {
            qDebug()<<str;
        }
    }
    return 0;
}
1
Avazart
Ёксперт —++
7791 / 5691 / 560
–егистраци€: 10.12.2010
—ообщений: 25,918
«аписей в блоге: 17
08.10.2014, 18:35 6
—обственно в —++Buider можно использовать UTF8String в данных (есть не€вное преобразование в UnicodeString и AnsiString по этому не создает неудобства)

—ериализаци€ UTF8String в XML, —++Buider
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//---------------------------------------------------------------------------
#include <System.Classes.hpp> // UTF8String
#include <string>             // std::string
 
#include <boost/serialization/nvp.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
//---------------------------------------------------------------------------
namespace boost
{
        namespace serialization
        {
                template<class Archive>
                inline void save(Archive& ar, const UTF8String& s,
                                const unsigned int /*version*/)
                {
                    std::string str= s.c_str();
                    ar << make_nvp("UTF8String", str);
                }
 
                template<class Archive>
                inline void load(Archive& ar, UTF8String& s,
                                const unsigned int /*version*/)
                {
                    std::string str;
                    ar >> make_nvp("UTF8String", str);
                    s=  str.c_str();
                }
 
                template<class Archive>
                inline void serialize(Archive& ar, UTF8String& s,
                                const unsigned int file_version)
                {
                    boost::serialization::split_free(ar, s, file_version);
                }
 
        } // namespace serialization
} // namespace boost
//---------------------------------------------------------------------------
0
08.10.2014, 18:35
MoreAnswers
Ёксперт
37091 / 29110 / 5898
–егистраци€: 17.06.2006
—ообщений: 43,301
08.10.2014, 18:35

—ериализаци€ и отправка сериализованного обьекта по сети
— сериализацией вроде разобралс€, а вот как получать сериализованный обьект дл€ отправки по сети не...

Ѕуст сериализаци€. указатель на абстрактный базовый класс без конструктора по умолчанию
„ита€ документацию по сериализации с помощью буста запуталс€. —итуаци€ следующа€. »меетс€...

CString::Format() и преобразование double в CString
¬от фрагмент программы: void CMy6_1Dlg::OnRadio3() { CString s; int i=m_list1.GetCount();...


»скать еще темы с ответами

»ли воспользуйтесь поиском по форуму:
6
ќтвет —оздать тему
ќпции темы

 ибер‘орум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
–ейтинг@Mail.ru