使用boost库序列化传输对象

来源:互联网 发布:银行数据安全 编辑:程序博客网 时间:2024/05/18 03:34

编写自己的消息结构

以下是我编写的一个简单的消息结构

复制代码
#ifndef MESSAGE_H#define MESSAGE_H#include <string>//serialization#include <boost/archive/text_oarchive.hpp>//deserialization#include <boost/archive/text_iarchive.hpp>using std::string;//message typeenum MessageOption{    Login,    Logout,    SendToAll,    PrivateChat};struct Message{    friend class boost::serialization::access;    //use this function to serialize and deserialize object    template<class Archive>    void serialize(Archive & ar, const unsigned int version)    {        ar & sender & receiver & message & option;    }    string sender;    string receiver;    string message;    MessageOption option;};#endif
复制代码

注意编写class或者struct时要编写serialize函数

接下来是序列化与反序列化的方法

复制代码
#ifndef SERIALIZE_H#define SERIALIZE_H#include <string>#include "Message.h"class Serialization{    public:        static std::string Serialize(const Message& msg);        static Message DeSerialize(const std::string& message);};#endif
复制代码
复制代码
#include "Serialization.h"#include <sstream>std::string Serialization::Serialize(const Message& msg){    std::ostringstream archiveStream;    boost::archive::text_oarchive archive(archiveStream);    archive<<msg;    return archiveStream.str();}Message Serialization::DeSerialize(const std::string& message){    Message msg;    std::istringstream archiveStream(message);    boost::archive::text_iarchive archive(archiveStream);    archive>>msg;    return msg;}
复制代码

(三)处理消息

刚才编写的那个消息结构里面有个option,通过这个option我们就可以知道这个对方发过来的消息是要干嘛的

以下是服务器处理客户端消息的函数

复制代码
template<typename T>void EpollServerSocket<T>::ProcessMessage(Socket& clientSocket){    std::string message;    ReceiveMessage(clientSocket,message);    T msgStruct=Serialization::DeSerialize(message);    switch(msgStruct.option)    {        case Login :            SendMessage(clientSocket,"Login_Success");            break;        case Logout:            SendMessage(clientSocket,"Logout_Success");            DeleteClient(clientSocket.GetSocketfd());            break;        case SendToAll:            SendToAllUsers(msgStruct.message);            break;  
        //messages of other type……

        default: break;
}}
0 0
原创粉丝点击