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>....
接收端解析方式:
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;
}
}
通过这种方式,可以很方便的加入新的域,而不影响与老版本程序的兼容性。新版本程序可以处理老版本程序发来的数据包,即:向后兼容。
OceanBase中大量使用了这种方式来处理,但我觉得,过于泛滥。因为: 兼容性有必要,但是没必要细化到每一个域。只要用一个比较粗的域来区分新旧版本即可,对于同一个版本内用RESERVE_PARAM_FIELD,BASIC_FIELD_PARAM这种区分每个域没必要,只需要按照约定顺序解析数据即可。

本文深入探讨OceanBase中使用的可扩展序列化协议,包括其基本单元、完整数据包格式以及接收端解析方式。同时,文章提出了对现有协议的优化建议,强调兼容性与简化解析流程的重要性。
1610

被折叠的 条评论
为什么被折叠?



