可扩展的序列化协议
OceanBase的序列化协议是一种可扩展的协议,其基本单元为:<TYPE_FLAG_FILED><Content>
一个完整的数据包是形如下面的内容:
<TYPE_FLAG_FILED><Content><TYPE_FLAG_FILED><Content><TYPE_FLAG_FILED><Content>.......<TYPE_FLAG_FILED><Content>
例如:
<RESERVE_PARAM_FIELD><readmode:1, trans_id:102><BASIC_FIELD_PARAM><tid:1024, cid:21, other:abc>....
接收端解析方式:
[cpp]
bool more = true;
while(more)
{
MyClass.deserialize(buf, pos, flag);
switch(flag)
{
case RESERVE_PARAM_FIELD:
deserialize_readmode();
deserialize_trans_id();
break;
case BASIC_FIELD_PARAM:
deserialize_tid_cid();
deserialize_other();
break;
case END_PARAM:
more = false;
break;
}
} www.zzzyk.com
通过这种方式,可以很方便的加入新的域,而不影响与老版本程序的兼容性。新版本程序可以处理老版本程序发来的数据包,即:向后兼容。
OceanBase中大量使用了这种方式来处理,但我觉得,过于泛滥。因为: 兼容性有必要,但是没必要细化到每一个域。只要用一个比较粗的域来区分新旧版本即可,对于同一个版本内用RESERVE_PARAM_FIELD,BASIC_FIELD_PARAM这种区分每个域没必要,只需要按照约定顺序解析数据即可。
补充:综合编程 , 其他综合 ,