使用boost库序列化传输对象

编写自己的消息结构

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

复制代码
#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 type
enum 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;
} }
展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值