c++ - 如何通过网络在 JSOn 字符串中序列化和发送 std::list?

标签 c++ json c++11 serialization boost

我正在尝试通过网络发送 std::list 容器内的数据列表。我不是单独发送列表的每个元素,而是尝试一次发送它。为此,我使用了 boost::serialization。我使用以下内容进行编译:

g++ -o main main.cpp DBAccess11.cpp -lsqlite3 -lboost_serialization

我得到了 this example 的帮助这与我正在寻找的非常相似。

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

下面是我的DBAccess1.h文件。

#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文件

#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 << " ";
}

下面是ma​​in.cpp

#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.cppLINE-84,此代码将完美运行。但是我没有看到序列化的输出。

没有LINE-84的输出如下:

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 时,它显示了数百个错误。第一个错误如下。

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;
            ^

我知道这是运算符重载问题。但是,我只想查看将在网络上传输的序列化数据。我该怎么做呢 ?请帮忙。

最佳答案

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

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 类型。

关于c++ - 如何通过网络在 JSOn 字符串中序列化和发送 std::list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29214168/

相关文章:

c++ - ostream 运算符<< 调用父ostream

C++ 数组排序,内存错误?

c++ - 错误 : "The preLaunchTask ' C/C++: g++. exe 构建事件文件'以退出代码 1 终止”

c++ - 包含单个 boost posix_time.hpp header 时编译错误

c++ - 虚拟方法返回代表派生对象类型的枚举 - 可以吗(就设计而言)?

javascript - JS Fetch JSON解析正在修改对象

python - 如何从 JSON 中提取循环 key ?

c++ - decltype 和 typeof 的区别?

c++ - 如何将函数指针传递给绑定(bind)?

c++ - 类型没有数据成员的静态断言