序列化方法以及基于序列化的网络通信方法
【技术领域】
[0001]本发明涉及网络技术领域,更具体地说,本发明涉及一种序列化方法以及基于序列化的网络通信方法。
【背景技术】
[0002]目前可选的一些网络传输方案,大致有传统的直接传输结构体内存和基于序列化的两种方案。
[0003]第一种方案的实现方式是将内存里的数据直接通过网络发送到对方,它的优点是不需要结构解析因此可以节约双方的CPU使用量,但是由于pod类型的数据都是定长数据,因此在发送列表或字典数据难以实现或极不灵活,发送字符串数据大部分采用直接设定一个最长字符串的方式传输,大多数情况都存在浪费内存的情况,传输较大字符串时浪费情况尤其明显。在客户端与服务器版本不一致需要扩展字段时不太容易实现,也无法实现对垃圾数据和恶意数据的字段级校验。
[0004]第二种方案大部分最著名的是协议缓冲(protocolbuffer),它是通过定义一个类型定义文件,然后生成各语言的代码的方式来实现序列化,它解决了第一种方案的诸多弊端,可以对可变长度数据进行有效的传输。但是它也有几个问题,第一是它不支持delphi,所以对于使用delphi做服务端的游戏无法使用;第二是它序列化后的数据量还是比较大,对于网络交互频繁的大型MM0(Massively Multiplayer Online)游戏来说对服务器的带宽要求比较高;第三是它不能实现在不更新代码的情况热更新协议。
【发明内容】
[0005]本发明所要解决的技术问题是针对现有技术中存在上述缺陷,提供一种能够提高运行时性能并且能够更容易实现遇到垃圾或恶意数据时的快速失败机制的
[0006]为了实现上述技术目的,根据本发明,提供了一种序列化方法,包括:
[0007]第一步骤:按照常规结构体定义的方式,将协议的定义抽象成类型系统,并且指明需要序列化的字段;
[0008]第二步骤:将定义的类型系统与特定的协议号绑定;
[0009]第三步骤:利用C++模板系统的SFINAE特性实现对协议字段和嵌套协议的自动序列化处理以生成序列化的结构体。
[0010]优选地,指明需要序列化的字段的步骤包括:将需要序列化的协议及协议字段信息抽象成对应类型系统的实例。
[0011]优选地,指明需要序列化的字段的步骤包括:将特定宏包含在结构体定义内。
[0012]而且,为了实现上述技术目的,根据本发明,还提供了一种基于序列化的网络通信方法,包括:
[0013]第一步骤:按照常规结构体定义的方式,将协议的定义抽象成类型系统,并且指明需要序列化的字段;
[0014]第二步骤:将定义的类型系统与特定的协议号绑定;
[0015]第三步骤:利用C++模板系统的SFINAE特性实现对协议字段和嵌套协议的自动序列化处理以生成序列化的结构体;
[0016]第四步骤:导出针对Lua的类而定义的针对公共访问权限的函数;
[0017]第五步骤:利用导出的函数在Lua网络端与C++网络端之间传递序列化的结构体;
[0018]第六步骤:修改协议定义,然后在注册协议处修改默认参数,通过运行客户端来自动更新配置文件,将更新的配置文件放入协议的更新版本。
[0019]优选地,指明需要序列化的字段的步骤包括:将需要序列化的协议及协议字段信息抽象成对应类型系统的实例。
[0020]优选地,指明需要序列化的字段的步骤包括:将特定宏包含在结构体定义内。
[0021]相比在运行时遍历判断类型的方式,将协议的定义抽象成类型系统,把需要序列化的协议及其字段信息抽象成对应类型系统的实例,并利用C++模板系统的SFINAE特性巧妙的实现了对字段和嵌套协议的自动序列化过程,相比其它解决方案大幅度提高了运行时性能并使代码结构更加简洁优美,模块化程度更高,并且可以更容易实现遇到垃圾或恶意数据时的快速失败机制。
【附图说明】
[0022]结合附图,并通过参考下面的详细描述,将会更容易地对本发明有更完整的理解并且更容易地理解其伴随的优点和特征,其中:
[0023]图1示意性地示出了根据本发明优选实施例的流程图。
[0024]需要说明的是,附图用于说明本发明,而非限制本发明。注意,表示结构的附图可能并非按比例绘制。并且,附图中,相同或者类似的元件标有相同或者类似的标号。
【具体实施方式】
[0025]为了使本发明的内容更加清楚和易懂,下面结合具体实施例和附图对本发明的内容进行详细描述。
[0026]在本发明中,利用C++模板系统的SFINAE特性生成类型系统,按照常规结构体定义的方式定义协议定义,并指明需要序列化的字段,绑定此协议的协议号后,可以加载本地数据或网络流,对对象进行序列化/反序列化处理并在C++和Lua中使用,并且与Lua通信时无需注册所有类型。
[0027]在不更新C++代码只更新资源的小版本更新中,可以通过自动生成的协议配置文件,无感知地修改协议或新增协议在Lua文件中使用,并且原有C++代码的逻辑不受影响。
[0028]图1示意性地示出了根据本发明优选实施例的流程图。流程图示出了本发明的序列化方法以及基于序列化的网络通信方法的具体实施例。
[0029]如图1所示,根据本发明优选实施例包括:
[0030]第一步骤S1:按照常规结构体定义的方式,将协议的定义抽象成类型系统,并且指明需要序列化的字段;
[0031]例如,指明需要序列化的字段的步骤包括:将需要序列化的协议及协议字段信息抽象成对应类型系统的实例。可替换地,例如,指明需要序列化的字段的步骤包括:将特定宏包含在结构体定义内。
[0032]第二步骤S2:将定义的类型系统与特定的协议号绑定;
[0033]在具体示例中,对于上述这两个步骤,例如,首先加入相关文件(比如,《Include“50如丨16(^.11”),然后像普通定义结构体一样定义协议类型(支持继承及多态),定义完之后参照样本(demo)给结构体增加一个RTTI宏以指明需要序列化的字段,然后在对应的cpp文件里通过注册加载器(loader)的方式将定义的类型系统与特定的协议号绑定,就可以随心所欲的进行序列化或者与网络客户端通信了。
[0034]其中,支持继承和多态的方式包括:序列化类型通过编译期生成的类型加载器支持继承和多态,不需要手工修改配置文件实现继承和多态的特征。
[0035]第三步骤S3