最近在做项目的时候,遇到一个问题,即结构体内的字段可能会在未来的时间内不停的增加(不会减少或者删除),所以在打包解包的时候就会涉及到版本兼容的问题,并且是向前和向后同时兼容。

我们先来看一下,如果结构体的内容永远不变,那么我们用结构体自解析的方法:

可以看出,结构体能够自己在打包/解包的时候,返回使用了的buff的长度,所以,如果我们是处理上述结构体的一个数组,那么代码可以这样写:

但是这样自解析带来的最大问题就是,我们会控制大量的版本,并且每次升级版本都要重发所有程序,这个成本是非常大的。

所以,我们需要对这种解析方式进行更改,需要考虑两个问题:
1.当新的API读到旧的格式的数据的时候,并写回的时候,怎么做。(即兼容旧数据)
2.当旧的已经发布的API读到新的数据的时候,并写回的时候,怎么做。(即兼容新数据)

答案是:
1.当新API读到旧的数据的时候,新API多的参数用默认值填充,写回的时候按照新API的格式写回。
2.当旧API读到新数据,自己不认识的那段buff,要保存起来,写回的时候,将这段buff原样memcpy。

所以output和input函数将会升级成这个样子:

而当解析上面的结构体数组时,则和原来的函数没有什么区别,所以保证了对外的接口统一。
最终问题完美解决~~

结构体初始化的方法

最近项目小组在去除代码中的warning,在修正代码的过程中看到了对结构体不正确的初始化方式: 假设有一个如下的struct定义: struct astruct {     int a;   ...

阅读全文

3则回应给“让数据解析能够做到向前向后完全兼容(最近做项目总结)”

  1. GuoJing说道:

    东西很不错,不过每个公司都有相应的解决方案吧。

    好久没看c/c++的东西了,感觉有点啃的吃力,呵呵。

    [回复]

    Dante 回复:

    呃,据我所知,互娱那边就是通过这种方式来保证各个版本兼容的~~

    [回复]

    kid 回复:

    may be protobuf or messagepack can help~

    [回复]

发表评论