消息收发的保护--序列化的方式

序列化 (Serialization)
将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Internet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。

对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。**

因为C结构体所设计的消息结构,无法满足保护消息的目的。如果在传输的过程中被捕获,解读没有任何的难度,甚至说一目了然。所以为了加深保护消息,也是为了使用的更加方面。我们采取boost库中对于输入出入保护的一种方式–archive

使用方式:
1 先引用头文件,
#include <boost/archive/text_oarchive.hpp>

#include <boost/archive/text_iarchive.hpp>
和文件的输入输出基本相似
2 在类的声明中, 你需要一个序列化函数,该函数的一般格式是:

template 《class Archive》
void serialize(Archive & ar, const unsigned int version)
{ //第二个参数是版本控制,version是版本号
ar& m_str;
}

有了模板之后,使用模板去构造一些类来作为消息写入与解读的方法。

class SRoomInfo {
public:
SRoomInfo() {}
SRoomInfo(std::string name, std::string info)
: m_bind(std::move(name)), m_chat(std::move(info)) {}
const std::string& name() const { return m_bind.bindName();}
const std::string& information() const { return m_chat.chatInformation();}
private:

friend class boost::serialization::access;
template
void serialize(Archive &ar, const unsigned int version) {
ar &m_bind;
ar & m_chat;
}
SBindName m_bind;
SChatInfo m_chat;

};
其中ar重载了&,可以把ar当做一个文件来看待。
当你在存盘的时候,类似于“>>”操作。
当你在读盘的时候,类似于“<<”操作。
我们可以使用 string来具象化他的使用方法。

有了序列化的方式,消息的发送可以实现动态的增减,所以max_length的保存方式已经失去意义。
以上就是对于boost库中archive的解读。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值