我正在尝试通过网络发送 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 << " ";
}
下面是main.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.cpp 的 LINE-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_oarchive
或 boost::archive::text_oarchive
类型。
关于c++ - 如何通过网络在 JSOn 字符串中序列化和发送 std::list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29214168/