首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过网络序列化和发送JSOn字符串中的std::list?

如何通过网络序列化和发送JSOn字符串中的std::list?
EN

Stack Overflow用户
提问于 2015-03-23 15:31:14
回答 1查看 436关注 0票数 1

我试图通过网络发送std:: list 容器中的数据列表。我不是单独发送列表中的每个元素,而是尝试一次发送。为此目的,我使用boost::serialization.我使用以下方法编译:

代码语言:javascript
运行
复制
g++ -o main main.cpp DBAccess11.cpp -lsqlite3 -lboost_serialization

我得到了this example的帮助,这与我所寻求的非常相似。

虽然,基于实例,我成功地编译了我的程序。但不幸的是,我没有看到任何序列化的输出。

下面是我的DBAccess1.h文件。

代码语言:javascript
运行
复制
#ifndef DBAccess1_HH  
#define DBAccess1_HH

#include <iostream>  // I have deleted some header for sake of readability
#include <list>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/list.hpp>

using namespace std;    
//================================//   
struct SiteCode
{
      int siteID;
      int siteCode;
  private:
      friend class boost::serialization::access;
      template<class Archive>
      void serialize(Archive & ar, const unsigned int /*version*/)
      {
            ar & siteID;
            ar & siteCode;
      }
 };

inline ostream& operator<< (ostream &out, SiteCode &site)
{
    out << "(" << site.siteID << "," << site.siteCode << ")";
    return out;
}
//================================//

class sqliteDB {
    list<SiteCode> Site_Code_list;
public:
    list<SiteCode> GET_ALL_Site_Code();
    void printList();
};
#endif**

下面是定义所有函数的DBAccess11.cpp文件

代码语言:javascript
运行
复制
#include <iostream>
#include <sqlite3.h>
#include <list>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/list.hpp>
#include "DBAccess1.h"

list<SiteCode> sqliteDB::GET_ALL_Site_Code()
{
        sqlite3 *db;
        const char *sql;
        sqlite3_stmt * stmt;

        int rc = sqlite3_open("/path/to/database.db", &db);
        sql = "SELECT * FROM SiteCode;";       
        rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);

    while(sqlite3_step(stmt)==SQLITE_ROW) {

            int A  = sqlite3_column_int(stmt, 0);
            int B = sqlite3_column_int(stmt, 1);

            SiteCode info;
            info.siteID = A;
            info.siteCode = B;              

            cout<<"Preparing to push data into List"<<endl;
            Site_Code_list.push_back(info);
            cout<<"Data was pushed successfully"<<endl;

            std::stringstream out;

            // serialize into the stream
            {
                boost::archive::binary_oarchive oa(out);
                oa << Site_Code_list;
//line-84>>>    cout<< oa << endl;
            }
        }
    sqlite3_finalize(stmt);
    sqlite3_close(db);
    return Site_Code_list;
}
//====================================================//
void sqliteDB::printList()
{
     int s = Site_Code_list.size();
     cout << "The size of List is :" << s << endl;
     for( list<SiteCode> :: iterator it = Site_Code_list.begin(); it !=  Site_Code_list.end(); it++)     
     cout << *it << " ";
}

下面是main.cpp

代码语言:javascript
运行
复制
#include <iostream>
#include <list>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/list.hpp>
#include "DBAccess1.h"

using namespace std ;

int main()
{
    sqliteDB object1;
    object1.GET_ALL_Site_Code();
    object1.printList();
    cout << "\n\nAll the statement were executed properly\n\n";
    return 0;
}

如果不包括DBAccess11.cpp行-84,则此代码运行良好。但我没有看到序列化的输出。

没有第84行的输出如下:

代码语言:javascript
运行
复制
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
Preparing to push data into List
Data was pushed successfully
The size of List is :10
(7,786) (8,78) (9,785) (10,998) (11,656) (13,23) (14,7) (15,74) (16,954) (17,752) 

当我尝试cout << oa时,它给我显示了数百个错误。第一个错误如下。

代码语言:javascript
运行
复制
DBAccess11.cpp: In member function ‘std::list<SiteCode> sqliteDB::GET_ALL_Site_Code()’:
DBAccess11.cpp:81:9: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘boost::archive::binary_oarchive’)
    cout << oa << endl;
            ^

我知道这是操作者超载的问题。但是,我只想看到网络上的序列化数据。我该怎么做?帮帮忙吧。

EN

Stack Overflow用户

发布于 2015-03-23 16:19:56

有必要向cout输出std::stringstream类的out实例,而不是oa实例,即

代码语言:javascript
运行
复制
std::stringstream out;

            // serialize into the stream
            {
                boost::archive::binary_oarchive oa(out);
                oa << Site_Code_list;
//line-84>>>    cout<< oa << endl;
            }
cout << out.str() << endl;

请注意,oa变量具有binary_oarchive类型,即二进制类型,输出将不可读。要想看到有用的东西,必须使用boost::archive::xml_oarchiveboost::archive::text_oarchive类型。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29214168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档